在说明复杂指针定义之前,我们先补习一下基本的指针定义形式。
普通指针
定义:int *p;
这个是定义一个指向int类型数据的指针。但是这样不容易理解,我自己的理解方式如下:
其实,p是一个32位的数字(64位系统为64位,这里以32位),只不过这个数字具体的意思是个内存地址,所以不能进行数学意义上的加减乘除(地址的加减乘除,是以类型大小sizeof(int)为单位的)。
如果我们直接使用p,则是一串数字地址,如果我们想要p地址处的数据,就需要加一个*。
因此,*p诞生了,意思是我要拿出地址p处的数据。
因此,p是一个单独的变量,里面存储的是地址。
因此,我们视觉上,可以这样写:
int* p;
即代表int*类型的变量p。
使用:
既然p是个单独的变量,那么直接使用p,就是在操作地址。为了操作p地址处的值,我们使用*,这时候,*p作为一个整体,含义就与变量一样了。我们直接认为它是个普通的变量即可。修改p地址处的值:
*p = 1;
数组指针与指针数组
数组指针是一个指向数组的指针,指针数组是一个存储指针的数组。这仍然是个抽象的定义,我们来看看例子。
指针数组:
int *p[10];
根据上文提示的,我们可以先转为
int* p[10];
格式,这样我们就很好理解了,p是一个存储int*指针类型的数组。
数组指针:
int (*p)[10];
根据上文理解,由于(*p)带了括号,说明强制*p为一个整体,而*p作为一个整体,可以认为是个普通变量,那我们用普通变量做一下类比,将*p替代为a:
int a[10];
这样就好理解了,*p类似于a,那么p变量保存的就是a的地址。这还有一点,”int (*p)[10];”仅仅是定义了一个指针,p仅占4个字节(32位机器)。
因此,p必须初始化才能用,比如:
int (*p)[10];
int a[10];
p = &a;
这样p初始化后才可以用,否则p是个随机数。
继续阅读