当前位置:首页 > 服务端 > 《c陷阱与缺陷》——数组与指针的关系(一维数组,二维数组)

《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陷阱与缺陷》上面有篇幅讲到,因此特意学习一下。 

作者:wdliming
来源链接:https://www.cnblogs.com/CodeWorkerLiMing/p/12831719.html

版权声明:
1、Java侠(https://www.javaxia.com)以学习交流为目的,由作者投稿、网友推荐和小编整理收藏优秀的IT技术及相关内容,包括但不限于文字、图片、音频、视频、软件、程序等,其均来自互联网,本站不享有版权,版权归原作者所有。

2、本站提供的内容仅用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人及本网站的合法权利。
3、本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站(javaclubcn@163.com),我们将第一时间核实后及时予以删除。





本文链接:https://www.javaxia.com/server/125606.html

分享给朋友:

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