数组指针
在 C 语言中,数组指针是一种指向整个数组的指针,其类型与普通指针不同。
特性 | 普通指针(指向元素) | 数组指针(指向整个数组) |
---|---|---|
声明 | int *p = array | int (*p)[4] = array |
类型 | int * (指向int) | int (*)[4] (指向含4个int的数组) |
指针运算 | p+1 跳过1个int (4字节) | p+1 跳过整个数组(16字节) |
解引用 | *p 访问单个元素 | *p 得到整个数组(可隐式转换为首元素地址)) |
例如:
int array[3][4] = {{0,1,2,3},{4,5,6,7},{8,9,10,11,12}};
int (*p)[4] = array;
int i,j;
for(i=0;i<3;i++)
{
printf("%p",p++);
}
输出的结果是0,4,8的地址。
为什么不直接用 *p = array
呢?
int array[3][4] = {{0,1,2,3},{4,5,6,7},{8,9,10,11,12}};
int *p = array;
int i,j;
for(i=0;i<3;i++)
{
printf("%p",p++); //虽然能遍历出来,但是失去了二维数组的感觉,因为它是以一整列输出的,没有一行一行输出
}
因为p++
和array++
的跨度是不一样的,p++
的跨度是单个int
型大小,而二维数组array++
的跨度是一整行;虽然程序能遍历出来,但是失去了二维数组的感觉,因为它是以一整列输出的,没有一行一行输出。
指针数组
在 C 语言中,指针数组是由多个指针组成的数组,其每个元素都是一个指针变量。
下面表格是:指针数组和数组指针的区别
特性 | 指针数组(数组元素是指针) | 数组指针(指向整个数组) |
---|---|---|
声明 | int *arr[4]; | int (*p)[4]; |
本质 | 数组(存储多个指针) | 指针(指向一个数组) |
元素类型 | int* (每个元素是指针) | int (指向的数组元素类型) |
访问方式 | arr[i] 获取第 i 个指针 | (*p)[i] 访问指向的数组的第 i 个元素 |
如下图:定义一个指针数组,存的是a,b,c,d的地址。
输出为:10 20 30 40