#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#define MAX_PARMS 20
#define DATA_MAX 50
struct s {
uint8_t cmd;
uint8_t main;
uint8_t sub;
uint8_t index;
uint8_t reg;
uint8_t sendlen;
uint8_t reclen;
uint8_t parm[MAX_PARMS];
};
struct t {
uint8_t hdr;
uint8_t data[DATA_MAX];
uint8_t len;
};
int main()
{
struct t *p = malloc(sizeof(struct t));
p->data[0] = 0xBC;
p->data[1] = 0xDE;
p->data[2] = 0xFF;
p->data[3] = 0x01;
struct s *testCmd1 = (struct s *) &p->data;
struct s *testCmd2 = (struct s *) p->data;
printf("0x%02x 0x%02x 0x%02x\n", p->data[0], testCmd1->cmd, testCmd2->cmd);
printf("0x%02x 0x%02x 0x%02x\n", p->data[1], testCmd1->main, testCmd2->main);
printf("0x%02x 0x%02x 0x%02x\n", p->data[2], testCmd1->sub, testCmd2->sub);
printf("0x%02x 0x%02x 0x%02x\n", p->data[3], testCmd1->index, testCmd2->index);
return 0;
}
运行上面的代码打印出来:
0xbc 0xbc 0xbc
0xde 0xde 0xde
0xff 0xff 0xff
0x01 0x01 0x01
我想知道为什么&amp; p-&gt;数据和p-&gt;数据似乎被解析到同一地址。
在我看来,&amp; p-&gt;数据应该是指向数据[0]地址的指针,而p->数据将只是数据[0]的地址。如果是这样的话,我会为其中一个打印出奇怪的值,对吗?
理想情况下,我不认为我会使用这样的代码,但是我在其他人的代码中遇到过它,这是我写的一个测试,看看发生了什么。
如果这个问题已经得到解答,我就找不到了,如果是这样的话就道歉。
答案 0 :(得分:1)
经过Étienne评论的帖子后回答我自己的问题:
“数组的地址与第一个元素的地址相同”
-John Bode(来自Address of array - difference between having an ampersand and no ampersand)
即。对于名为“data”的数组:&amp; data == data
因此,在我的情况下,&amp; p-&gt;数据与p-&gt;数据的地址相同。
感谢您的快速回复,Étienne!
答案 1 :(得分:0)
p->data
在值上下文中使用时表示&p->data[0]
,因为它是数组的名称。这是指向数组第一个元素的指针。
&p->data
是指向整个数组的指针。当名称与&
或sizeof
一起使用时,将禁止将数组名称转换为指向第一个元素的指针的操作。
整个数组从与数组的第一个元素相同的内存位置开始,这就是为什么这些指针在转换为通用类型时都包含相同的内存地址。
NB。两个指针使用相同的内部表示并不是标准要求,尽管几乎所有系统都会这样做。