C语言中的指针变量p,特殊表达式p[0] ,(*p)[0],(px+3)[2] ,(*px)[3]化简方法
2024-01-10 15:15:55
一.已知以下代码,请问以下 式子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博客
文章来源:https://blog.csdn.net/weixin_44651073/article/details/135501418
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!