初识指针

来源:互联网 发布:linux 发送icmp请求包 编辑:程序博客网 时间:2024/04/25 22:51

如何理解指针?

首先,指针是一个变量。这样的话,指针就有了变量的特性。

  • 系统为指针分配内存空间;
  • 指针有自己的地址;
  • 指针能够存值,但这个值比较特殊——地址。

在前面的博客中已经提到指针在内存中占4个字节,即指针的字节长度为4字节。

定义指针的规范?
int * p;
怎么理解这句话,我是这么理解的:p是一个指针变量,保存的是一个地址,该地址是整型的。

指针的类型和指针指向的类型

为什么需要不同类型的指针?
虽然指针的字节长度相同,但是不同类型的指针的步长不同(就是指针加一后的值不同。)
这里举个例子:
int * p; //p为整型指针,p+1跳4个字节。
char * p;//p为字符型指针,p+1跳1个字节
int (*p)[3];//p为数组指针变量,保存的是该数组的地址,p+1跳12个字节

指针指向的类型:
当你通过指针来访问指针所指向的内存区时,指针所指向的类型决定了编译器将把那片内存区里的内容当作什么来看待。
从语法上看,只须把指针声明语句中的指针名字和名字左边的指针声明符“*”去掉,剩下的就是指针所指向的类型。例如:
(1)int*ptr; //指针所指向的类型是int
(2)char*ptr; //指针所指向的的类型是char
(3)int**ptr; //指针所指向的的类型是int*
(4)int(*ptr)[3]; //指针所指向的的类型是int()[3]
(5)int*(ptr)[4]; //指针所指向的的类型是int()[4]

指针的值

指针的值也叫作指针所指向的内存区或地址。指针的值是指针本身存储的数值,这个值将被编译器当作一个地址,而不是一个一般的数值。在32位程序里,所有类型的指针的值都是一个32位整数,因为32位程序里内存地址全都是32位长。指针所指向的内存区就是从指针的值所代表的那个内存地址开始,长度为sizeof(指针所指向的类型)的一片内存区。以后,我们说一个指针的值是XX,就相当于说该指针指向了以XX为首地址的一片内存区域;我们说一个指针指向了某块内存区域,就相当于说该指针的值是这块内存区域的首地址。
下面举个例子来具体说明:

int num = 5int *p = #int **pp = &p;int ***ppp = &pp;num++;p++;(*p)++;

画个图来方便说明:
这里写图片描述
首先定义一个变量,变量名为num,对应内存空间的值为5,该内存空间的地址为0x1000。
对上面5~7行的说明:
num++:对num对应的内存空间的值自加1;
p++:对p对应的内存空间的值自加1; p++ = 0x1004
(*p)++:对p指向的内存空间的值自加1;

对(*p)++的一些说明:
首先说下* 这个运算符,*为取值运算符和间接运算符,这里我说下取值运算符。取值运算符为:取指针变量对应内存空间保存的地址对应的内存空间的值。这个说法有点拗口,那我们引出指向的内存空间这个概念。指向的内存空间指的是:这个指针变量对应内存空间里保存的地址对应的内存空间。因此,刚刚取值运算符的作用我们可以表述为:取指向的内存空间的值。

我们已经知道变量的地址由指针保存,那么指针变量的地址由什么保存呢?
答案是二维指针,二维指针保存的就是一维指针的地址。我们可以这样总结:变量的地址由一维指针来保存,一维指针的地址由二维指针来保存,二维指针的地址由三维指针来保存,后面的以此类推。

尝试上图中的一些等式:
如 num == *p == **pp == ***ppp;
pp == *ppp == &p;
&num == p == *pp == **ppp;
ppp == &pp;
可能还有一些等式,请读者自己尝试写写,对你理解多维指针有帮助!

0 0