c练习题

 
#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 这样对三位数组,*,[],优先级的考虑 地址间的计算,+,-,不是简单的地址的加减,而是地址所指元素个数的变化。  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值