#include <stdio.h> int main(void) { int a[100][200]={0}; printf("%d,%d\n",&a[37][45],&a[0][3]); printf("%d\n",&a[37][45]-&a[0][3]); return 0; }
a[37][45]的地址为1194780,a[0][3]的地址为1165012 &a[37][45]-&a[0][3]计算不是地址之间的差值,而是这两个元素之间的距离。 这两个元素的地址之间的差值/sizeof(int) 37*200+45-3=7442. #include<stdio.h> int main() { int p[3][4][5]; int *q=(int *)p; int (*s)[5]=&p[1][0]; int i; for (i=0;i<60;i++) { q[i]=i; } printf("%d,%d\n",p[1][7][1],*(s+1)[3]);//1 printf("%d\n",p[1][7][1]*(*(s+1)[3]));//2 return 0; } 在内存中存的结构:
![]()
int *q=(int *)p;强制类型转化为int型指针。q指向p[0][0][0]. int (*s)[5]=&p[1][0];数组指针s指向p[1][0]。 for (i=0;i<60;i++) { q[i]=i; } 进行初始化 运行结果:
其p[0][0][0]=0,p[0][0][1]=1,p[0][0][2]=2,p[0][0][3]=3 p[1][7][1]=1*4*5+7*5+1=56. (*(s+1)[3]),其中s指向p[1][0],s+1指向p[1][1], (*(s+1)[3]),中[]的优先级高,先执行(s+1)[3],(s+1)[3]可以表示为*(s+1+4)= *(s+4) S+4指向p[1][4] (*(s+1)[3])=*(*(s+4))=p[1][4][0] P[1][4][0]=20 因此可以得出结果 稍微改一下: #include<stdio.h> int main() { int p[3][4][5]; int *q=(int *)p; int (*s)[5]=&p[1][0]; int i; for (i=0;i<60;i++) { q[i]=i; } printf("%d,%d\n",p[1][7][1],(*(s+1))[3]);//3 printf("%d\n",p[1][7][1]*((*(s+1))[3]));//4 return 0; } 运行结果:
![]()
发现这两个不同 (*(s+1))[3]的计算: 先计算*(s+1),s指向p[1][0],s+1指向p[1][1],*(s+1)变成了指向p[1][1][0] (*(s+1)[3])=*(*(s+1)+3)=p[1][1][3]=28 这样对三位数组,*,[],优先级的考虑 地址间的计算,+,-,不是简单的地址的加减,而是地址所指元素个数的变化。
![]()
c练习题
最新推荐文章于 2024-07-12 07:45:11 发布