扫描关注一起学嵌入式,一起学习,一起成长
以下图示a表示计算机内存,b表示一个函数调用时在栈(stack)上开辟的栈帧空间:
数组名在一定的上下文中会转换为指向数组首元素的地址,以方便指针的算术运算,如
(资料图)
#include intmain(){inta[5]={0};charb[20]={0};*(a+3)=10;//a+3是指相对于地址a,偏移sizeof(int)个字节*(b+3)="x";//b+3是指相对于地址b,偏移sizeof(char)个字节printf("%d,%c\n",a[3],b[3]);//10,xwhile(1);return0;}
可以图示一下以上代码指针的偏移细节:
#include voidswap1(intx,inty){inttmp;tmp=x;x=y;y=tmp;}voidswap2(int*x,int*y){inttmp;tmp=*x;*x=*y;*y=tmp;}voidcaller(){inta=10;intb=20;swap1(a,b);printf("%d%d\n",a,b);swap2(&a,&b);printf("%d%d\n",a,b);}intmain(){caller();return0;}
以上代码可用以下图示理解:swap1传值:
swap2传址(指针传递):
二维数组是数组的数组,n维数组是n-1维数组的数组。内存是一维的字节序列,所谓的n维数组其实只是一个逻辑意义的表示,其物理结构还是一维线性的。
n维数组的元素是一个n-1维数组。如果用指针指向一个n维数组,其指针类型必须有n-1维的长度信息,当其用作函数参数时也是如此。
voidg(inta[][2]){//voidg(int(*a)[2]){是相同写法a[2][0]=5;}voidcaller(){inta[3][2];int(*p)[2]=a;*(*(p+2)+0)=7;//p=2表示相对于地址p偏移sizeof(*p)printf("%d\n",a[2][0]);//7g(a);printf("%d\n",a[2][0]);//5}
以下代码可以用以下图示辅助理解:
ref:Kyle Loudon《 Mastering Algorithms with C》
C 语言中的三块技术难点
C语言进阶之 回调函数详解
详解 C 语言指针,一文给他搞定
个人微信开放,扫码添加,进高质量嵌入式交流群
觉得文章不错,点击“分享”、“赞”、“在看” 呗!
Copyright 2015-2022 海峡晨报网 版权所有 备案号:皖ICP备2022009963号-10 联系邮箱:396 029 142 @qq.com