图解C语言指针变量,清晰易懂|世界报资讯
- 来源:面包芯语
- 2023-05-04 09:28:40
- 收藏
扫描关注一起学嵌入式,一起学习,一起成长
以下图示a表示计算机内存,b表示一个函数调用时在栈(stack)上开辟的栈帧空间:
2 指针变量与数组名
数组名在一定的上下文中会转换为指向数组首元素的地址,以方便指针的算术运算,如
【资料图】
#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;}
可以图示一下以上代码指针的偏移细节:
3 主调函数与被调函数之间的指针传递
#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传址(指针传递):
4 数组做函数参数
二维数组是数组的数组,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 语言指针,一文给他搞定
个人微信开放,扫码添加,进高质量嵌入式交流群
觉得文章不错,点击“分享”、“赞”、“在看” 呗!
标签: