数组指针
在 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}};
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
587

被折叠的 条评论
为什么被折叠?



