野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 23093|回复: 3

这句代码怎样解释?

[复制链接]
发表于 2019-10-24 12:39:42 | 显示全部楼层 |阅读模式
   SPI_FLASH_BufferRead((uint8_t *)&strXPT2046_TouchPara,FLASH_TOUCH_PARA_ADDR,4*6*8);
其中strXPT2046_TouchPara是结构体数组名,代表这个结构体数组的首地址.而&是获得地址的意思,&strXPT2046_TouchPara这又该如何解释呢?
(uint8_t *)&strXPT2046_TouchPara是不是应该是这样的((uint8_t *)strXPT2046_TouchPara呢?

回复

使用道具 举报

 楼主| 发表于 2019-10-24 20:13:19 | 显示全部楼层
没人回答么?顶起
回复 支持 反对

使用道具 举报

发表于 2019-10-25 23:52:31 | 显示全部楼层
编译器可能不是这么想的

“结构体类型的变量名并不能直接当作地址使用”
https://blog.csdn.net/u012252959/article/details/82662542
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-10-28 13:24:54 | 显示全部楼层
感谢WishWish的回答
后来经过试验,发现(uint8_t *)&strXPT2046_TouchPara和((uint8_t *)strXPT2046_TouchPara是一样的,它们具有相同的地址值.
int a[10];
其中a是数组名,代表这个数组的首地址;而a又是一个有10个元素的数组,&a代表这个数组的地址.所以a = &a.

从这里知道自己的基本功还不扎实.再次感谢wishwish的解答.



1)         数组

  数组在声明时,即分配了空间:
   int a[5];

  一旦声明a[5],相当于有a、a[0]、a[1]、a[2]、a[3]、a[4]这6个变量名。a[i]的指代方式和普通的变量名int i相同,指到一个对应的内存空间;关键是变量名a,本身就可以做地址用。我们知道a是数组名,但a并不代表整个数组的地址,而是指向数组首元素的地址(虽然在数值上是相同的,下面会有详细解释),所以可以有 int *p = a;。那么&a又怎么解释呢?对于int i而言,i代表一个空间,&i表示i所代表的空间地址;那么&a应该也是表示a所代表的地址了,也就是整个数组的地址。

  a、&a和&a[0]同代表地址,且由于数组是顺序存储,所以a、&a和&a[0]所表示的地址在数据上是相同的,但是实际的指代意义却是不同的:
•a是个int*类型的数据,相当于&(*a),是指向数组首元素的地址;
•&a指代整个数组,是个int(*)[]类型的数据,是指针数组的地址;
•&a[0]则是仅指代一个存储int的空间,是int*类型的数据。

  也就是数组名,本身可以作为地址使用,指代该结构的首元素的地址。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2025-12-14 22:49 , Processed in 0.050457 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表