服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - 基于指针的数据类型与指针运算小结

基于指针的数据类型与指针运算小结

2020-12-24 14:18C语言教程网 C/C++

以下是对指针的数据类型与指针运算进行了详细的总结介绍,需要的朋友可以过来参考下

1.指针的数据类型小结

有关指针的数据类型

定义

含义

int i;

定义整形变量

int *p;

定义只想整型数据的指针变量p

int a[n];

定义整形数组a,它有n个元素

int *p[n];

定义指针数组p,它由n个指向整形数据类型的指针元素组成

int (*p)[n];

定义指向n个元素的一位数组的指针变量

int f();

f为带回整形函数值的函数

int *p();

p为带回一个指针的函数,该指针指向整形数据。

int (*p)();

p为指向函数的指针,该函数返回一个整形数据

int * *p;

p为一个指向指针的指针变量,它指向一个整形数据的指针变量


2.指针的运算小结
(1)指针变量的赋值

复制代码 代码如下:

int a;
int *p
p=&a;


将变量a的地址赋给p

复制代码 代码如下:

int a[3]={1,2,3};
int *p;
p=a;


将数组首元素的地址赋给指针p

复制代码 代码如下:

int a[3]={1,2,3};
int *p;
p=&a[2];


将数组中的元素的地址赋给指针p

复制代码 代码如下:

int main(){
    int  f(int z);
    int (*p)(int z);
    p=f;
    p(5);
}
int f(int z ){
cout<<z<<endl;
}


f为已经定义的函数,将f的入口地址赋给p

复制代码 代码如下:

int a=3;
int *p1=&a;
int *p2=p1;


p1和p2是同类型的指针,将p1的值赋给p2

(2)指针变量赋空值
指针变量可以有空值,即该指针变量不指向任何变量,可以这样表示:

复制代码 代码如下:

p=NULL;


实际上NULL代表整数0,也就是使p指向地址为0的单元。这样可以使指针不指向任何有效的单元。
实际上系统已经定义了NULL:

复制代码 代码如下:

#define NULL 0


C++中在iostream头文件中就包括了以上的NULL定义,NULL使一个符号常量。
在C-free编辑器中运行:

复制代码 代码如下:

#include<iostream>
using namespace std;
int main(){
 cout<<NULL;
 cout<<endl;
}



基于指针的数据类型与指针运算小结

应注意,p的值等于NULL和p未被赋是两个概念。前者是有值得(值为0),不指向任何变量,后者虽未对p赋值但并不等于p无值,只是它的值是一个无法预料的值,也就是p可能指向某一个未指定的单元。这种情况是非常危险的。因此,在饮用变量之前一定要对其进行赋值。

任何指针变量或地址都可以与NULL做相等或者不等的比较:

复制代码 代码如下:

if(p==NULL)p=p1;


上面的语句还可以写成:

复制代码 代码如下:

if(!p)p=p1;


还应注意
int *p=NULL;和int *p;*p=NULL;的区别:
int *p=NULL是定义了一个指向整形变量的指针,并且对该指针进行了初始化操作,赋初始值为NULL;
而int *p;是定义了一个指向整形变量的指针,因为没有对该指针进行初始化,所以它可能指向任何一个值,因此可能指向一个非法的值,例如系统内存中的变量。

然后*p =NULL;是使p所指向的变量的值为0,因为p所指向的值是不确定的,所以该操作是十分危险的。

(3)指针变量的赋值应该注意的问题
我们知道基类型相同的不同的指针变量之间可以赋值。
不同的的基类型的变量之间是不可以进行赋值的。
运行代码:

复制代码 代码如下:

#include<iostream>
using namespace std;
int main(){
<span style="white-space:pre"> </span>int *p1,i=5;
<span style="white-space:pre"> </span>double *p2 ,j=2.5;
<span style="white-space:pre"> </span>p1=&i;
<span style="white-space:pre"> </span>p2=&j;
 p1=p2;
    cout<<*p1<<endl;
    return 0;
}


编辑器提示:

基于指针的数据类型与指针运算小结


可以通过强制类型转化实现上述赋值:

复制代码 代码如下:

#include<iostream>
using namespace std;
int main(){
 int *p1,i=5;
 double *p2 ,j=2.5;
 p1=&i;
 cout<<*p1<<endl;
 p2=&j;
 cout<<*p2<<endl;
 p1=(int *)p2;
    cout<<*p1<<endl;
    return 0;
}


虽然,上述操作不再报错,但是指针的强制类型转发生了数据截断,所以仍然得不到理想的结果:

基于指针的数据类型与指针运算小结


关于指针的强制类型转换

(4)指针变量加/减一个整数

例如:

复制代码 代码如下:

p++;
p--;
p+i;
p-1;
p+=i;
p-=i;


C++规定,一个指针变量加/减一个整数是将该指针变量的原值(原来指向的地址)和它指向的变量所占用的内存单元字节数相加或者相减。

如p+i;代表这样的地址计算:p+i*d,d是p所指向的变量单元所占用的字节数。这样才能保证p+i指向p下面的第i个元素。

(5)两个指针变量相减
如果两个指针指向的同一个数组中的元素,则两个指针变量之差是两个指针变来那个之间的元素的个数。

复制代码 代码如下:

#include<iostream>
using namespace std;
int main(){
 int a[10]={1,2,3,4,5,6,7,8,9,10};
 int *p1=&a[3];
 int *p2=&a[5];
 cout<<(p2-p1)<<endl;
 cout<<(p1-p2)<<endl;
 return 0;
}


运行结果:

基于指针的数据类型与指针运算小结

(6)两个指针变量比较
若两个指针指向同一个数组的元素,则可以进行比较大小。指向前面元素的指针变量小于指向后面元素的指针变量。

复制代码 代码如下:

#include<iostream>
using namespace std;
int main(){
 int a[10]={1,2,3,4,5,6,7,8,9,10};
 int *p1=&a[3];
 int *p2=&a[5];
 if(p1<p2){
  cout<<"p1<p2"<<endl;
 }else{
  cout<<"p1>=p2"<<endl;
 }
 return 0;
}


结果输出:

基于指针的数据类型与指针运算小结

还可以利用这个性质,输出数组中的所有的元素:

复制代码 代码如下:

#include<iostream>
using namespace std;
int main(){
 int a[10]={1,2,3,4,5,6,7,8,9,10};
 int *p=a;
    while(p<a+10){
     cout<<*p<<endl;
     p++;
    }
 return 0;
}


输出结果:

基于指针的数据类型与指针运算小结

延伸 · 阅读

精彩推荐
  • C/C++C语言main函数的三种形式实例详解

    C语言main函数的三种形式实例详解

    这篇文章主要介绍了 C语言main函数的三种形式实例详解的相关资料,需要的朋友可以参考下...

    ieearth6912021-05-16
  • C/C++关于C语言中E-R图的详解

    关于C语言中E-R图的详解

    今天小编就为大家分享一篇关于关于C语言中E-R图的详解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看...

    Struggler095962021-07-12
  • C/C++C语言实现双人五子棋游戏

    C语言实现双人五子棋游戏

    这篇文章主要为大家详细介绍了C语言实现双人五子棋游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    两片空白7312021-11-12
  • C/C++c/c++实现获取域名的IP地址

    c/c++实现获取域名的IP地址

    本文给大家汇总介绍了使用c/c++实现获取域名的IP地址的几种方法以及这些方法的核心函数gethostbyname的详细用法,非常的实用,有需要的小伙伴可以参考下...

    C++教程网10262021-03-16
  • C/C++OpenCV实现拼接图像的简单方法

    OpenCV实现拼接图像的简单方法

    这篇文章主要为大家详细介绍了OpenCV实现拼接图像的简单方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    iteye_183805102021-07-29
  • C/C++深入C++拷贝构造函数的总结详解

    深入C++拷贝构造函数的总结详解

    本篇文章是对C++中拷贝构造函数进行了总结与介绍。需要的朋友参考下...

    C++教程网5182020-11-30
  • C/C++使用C++制作简单的web服务器(续)

    使用C++制作简单的web服务器(续)

    本文承接上文《使用C++制作简单的web服务器》,把web服务器做的功能稍微强大些,主要增加的功能是从文件中读取网页并返回给客户端,而不是把网页代码...

    C++教程网5492021-02-22
  • C/C++c/c++内存分配大小实例讲解

    c/c++内存分配大小实例讲解

    在本篇文章里小编给大家整理了一篇关于c/c++内存分配大小实例讲解内容,有需要的朋友们可以跟着学习参考下。...

    jihite5172022-02-22