《c陷阱与缺陷》——数组与指针的关系(一维数组,二维数组)

一维数组、指针的关系
定义数组
int array[3] = {0,12,2};
定义数组指针,指向一个大小为3个整型的数组
int (*ap)[3] = array; 其实这个方式的赋值,编译器会出现类型不匹配的报警,warning: assignment from incompatible pointer type,但是程序员应该知道会用。
普通的整型指针
int *intmp = array;这个比较简单的,不细讲了

以数组指针访问一维数组的方式:
for (int i = 0; i < 3; i++)
{
printf("*(intmp[%d]) = %d \t", i, *(*(ap) + i)); //valid 等价于*(*(ap+0) + i)
ap+1,就增加一个数组大小,而不是int大小。这点和整型指针有区别。
printf("*(intmp[%d]) = 0x%x \t", i, (*(ap) + i)); //valid
printf("\n");
}
二位数组、数组指针的关系
int cal[12][3] =
{
[0] = {[0] = 11},
[1] = {[1] = 22},
};

int (*mp)[3] = cal; 这个方式的赋值没有编译器报警。是正确的。

mp = cal;

以数组指针访问二维数组
1、打印数组内容
for (int i = 0; i < 12; i++)
{
for (int j = 0; j < 3; j++)
{
printf("mp[%d][%d] = %d\t", i, j, mp[i][j]); 等价于*(*(mp+i) + j)
}
printf("\n");
}
赋值操作,如果int *ap=cal,编译会报警,但是可以运行,但是不能执行ap[i][j]的操作,只能ap[i]
int value = 0;
for (mp = &cal[0]; mp < &cal[12]; mp++)
{
int *dayp;
for (dayp = *mp; dayp < & (*mp)[3]; dayp++)
{
value++;
*dayp = value;
}
}
mp从cal[0]元素遍历到cal[12],注意&符号,如果没有加,编译器会报警。assignment from incompatible pointer type,comparison of distinct pointer types lacks a cast(来自不兼容指针类型的赋值,不同指针类型的比较缺少强制转换) 因此建议加上。
或者使用for (mp = cal; mp < cal + 12; mp++)这种方式,比较容易懂,意思是mp指针分别遍历12个数组元素,每个数组元素包含一个子数组,子数组中有3个int元素,

for (dayp = *mp; dayp < & (*mp)[3]; dayp++)等价于for (dayp = (*(mp+0)+0); dayp < (*(mp+0)+3); dayp++)

其实,这种方式一般新手是使用的比较少的,一般直接使用数组的形式,因为看到《c陷阱与缺陷》上面有篇幅讲到,因此特意学习一下。 

posted @ 2020-05-05 18:07  wdliming  阅读(394)  评论(0编辑  收藏  举报