指针数组与数组指针
一、数组指针
数组指针就是指向数组的指针,相当于是一个二维数组,先看一个例子:
int a[2][2]={1,2,3,4}; //这是一个2*2的二维数组
int (*p)[2]; //数组指针
p=a; //令p指向数组a
int (*p)[2];这里的p是一个数组指针变量。
假如说a中各元素的地址如下:
内存 | 地址 |
---|---|
1 | 0x0012ff38 |
2 | 0x0012ff3c |
3 | 0x0012ff40 |
4 | 0x0012ff44 |
则a和p中各元素的值如下:
名字 | 值 |
---|---|
a | 0x0012ff38 |
a[0] | 0x0012ff38 |
a[1] | 0x0012ff40 |
p | 0x0012ff38 |
p[0] | 0x0012ff38 |
p[1] | 0x0012ff38 |
&a[1][0] | 0x0012ff40 |
&a[0][0] | 0x0012ff38 |
p+1 | 0x0012ff40 |
a+1 | 0x0012ff40 |
a[0]+1 | 0x0012ff3c |
a是一个数组名,类型是指向一维数组的指针,不是变量,a的值是指针常量,即不能有a++或者a=p这些操作。a指向这块连续空间的首地址,值是&a[0][0]。
a[0]是一维数组名,类型是指向整型的指针,值是&a[0][0],这个值是一个常量。
a[1]是一维数组名,类型是指向整型的指针,值是&a[1][0],这个值是一个常量。
p是一个数组指针变量,指向一维数组的指针变量,值是&a[0][0]。可以执行p++;p=a等操作。
a+1表示指向下一行元素,也可以理解为指向下一个一维数组。
*(a+1)是取出第一行的首地址。
a[0]+1是指向第0行第1个元素,也可以理解为指向一维数组a[0]的第一个元素。
p+1同a+1
(p+1)同(a+1)
虽然a跟a[0]值是一样,但类型不一样,表示的意义不一样。通过分析就不难理解为什么((a+i)+j)和a[i][j]等效了。
二、指针数组
就和整型数组是用来存放整数一样,指针数组是用来存放指针的数组,看下面的例子:
int i=1,j=2; //p先跟[]结合,然后再跟*结合
int *p[2]; //指针数组,存放指针的数组
p[0]=&i;
p[1]=&j;
printf("%d",sizeof(p));
此例数组p就两个元素,p[0]是指向i的指针,p[1]是指向j的指针。这两个指针都是int型指针,所以p是存放int型指针的数组。sizeof(p)返回数组占用的总空间,所以程序输出是8