C语言中的指针变量p,特殊表达式p[0] ,(*p)[0],(px+3)[2] ,(*px)[3]化简方法

一.已知以下代码,请问以下 式子p[0]  ,p[1]  ,(*p)[0]  ,(*p)[1] 是什么意思?

int A[3] = {1,2,3};
int (*p)[3] = &A;

因为前面的嵌入式C语言基础的章节中说过,数组下标其实就是数组首元素的地址往上偏移的单位数,即:   

*(A+0)   等价于  A[0]
*(A+1)   等价于  A[1]
*(A+2)   等价于  A[2]

化简方法:

p[0] =*(p+0)= *p = *(&A) = A = &A[0]

p[1] =*(p+1)= *(&A+1) 结构体A向上挪动12个字节,这样会出现访问越界。

(*p)[0] = (*&A)[0] = A[0]  首元素的值

(*p)[1] = (*&A)[1] = A[1]  第一个元素的值

结论:

p[0]     --> 数组首元素的地址
p[1]     --> 段错误
(*p)[0]  --> 数组首元素的值
(*p)[1]  --> 数组第2个元素的值

二.如果有以下式子说明:
 int B[10];
 int (*p)[10] = &B;
 int *px = B;

则以下能够正确引用数组的元素的是: CEF 
A. *p+1    B.  *(p[1])   C. (px+3)[2]   D. (*px)[3]   E. (*p)[0]    F. *(px+1)

化简方法:

*p+1 = *(&B)+1 = &B[0]+1 = &B[1]                        第二个元素地址

*(p[1]) = *(p[1]) =*(*(p+1))= *(*(&A+1))             越界

(px+3)[2] = *(px+3+2)= *(px+5) = *(B+5)= B[5]

(*px)[3] = (*B)[3] = *(*B+3)= *(*&B[0]+3) = *(B[0]+3)

p[0] =*(p+0)= *p = *(&B) = B= &B[0]

*(px+1) = *(B+1) = B[1]

其他指针内容推导看:

 第五篇,c语言中的数组和指针定义及其特别重要的运算关系。_array size missing in 's-CSDN博客

第 七篇,二维指针和二维数组知识讲解。_二维指针怎么定义-CSDN博客

  • 10
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

肖爱Kun

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值