C++ 动态更改指向结构的指针数组的数据类型

C++ 动态更改指向结构的指针数组的数据类型,c++,c,arrays,pointers,struct,C++,C,Arrays,Pointers,Struct,我试图从结构中编写变量指针数组。我的问题是结构中的变量具有不同的数据类型 #include "stdlib.h" typedef struct val { unsigned char a; unsigned char b; unsigned short c; unsigned int d; } _letters; void setup() { Serial.begin(9600); } int var1 = 0; void loop() { _letters lt; lt.

我试图从结构中编写变量指针数组。我的问题是结构中的变量具有不同的数据类型

#include "stdlib.h"

typedef struct val {
 unsigned char a;
 unsigned char b;
 unsigned short c;
 unsigned int d;
} _letters;

void setup() {
 Serial.begin(9600);
}

int var1 = 0;

void loop() {
 _letters lt;
 lt.a = 1;
 lt.b = 2;
 lt.c = 3;
 lt.d = 4;

 unsigned char *ptrLetters[4];
 ptrLetters[0] = &lt.a;
 ptrLetters[1] = &lt.b;
 ptrLetters[2] = &lt.c;   //here is the problem
 ptrLetters[3] = &lt.d;  //also here

 var1 = (int)*ptrLetters[0];

 Serial.println(var1);
}
这是因为我想通过数组的索引(*ptrLetters[index])保存地址并访问结构中的变量(我无法修改),但问题是结构中存在不同的数据类型,指针仅针对字符类型进行初始化。
如何动态更改它?

您可以使用void(非类型化)指针数组:

void *ptrLetters[4];
ptrLetters[0] = &lt.a;
ptrLetters[1] = &lt.b;
ptrLetters[2] = &lt.c;   //here is the problem
ptrLetters[3] = &lt.d;  //also here
然后您可以像这样访问变量:

var1 = *((char*)ptrLetters[0]);
请注意,必须首先将void指针强制转换回原始类型以取消引用。然后在赋值时隐式执行到int的转换

指向任何类型的对象的指针可以隐式转换为(可选cv限定);指针值不变。反向转换需要
静态转换
或显式转换,生成原始指针值:

对于解引用,在C中,您可以简单地执行以下操作:

unsigned char var1 = *((char*)ptrLetters[0]);
unsigned char var2 = *((char*)ptrLetters[1]);
unsigned short var3 = *((unsigned short*)ptrLetters[2]);
unsigned int var4 = *((unsigned int*)ptrLetters[3]);
<>你也用C++来标记这个,最好在C++中使用<代码> StasyType Case<代码> >

unsigned char var1 = *(static_cast<unsigned char*>(ptrLetters[0]));
unsigned char var2 = *(static_cast<unsigned char*>(ptrLetters[1]));
unsigned short var3 = *(static_cast<unsigned short*>(ptrLetters[2]));
unsigned int var4 = *(static_cast<unsigned int*>(ptrLetters[3]));
unsigned char var1=*(静态_cast(ptrLetters[0]);
unsigned char var2=*(静态_cast(ptrLetters[1]);
无符号短变量3=*(静态_转换(ptrLetters[2]);
无符号int var4=*(静态_cast(ptrLetters[3]);

关于为什么只使用指针数组,或者为什么要使用指针,您没有解释太多。根据您在示例代码中尝试执行的操作,您可以通过多种方式执行

最简单的方法是使用指向struct的指针:

_letters *ptrLetter;
ptrLetter = &lt;

var1 = ptrLetter->a;

也可以探索指针的结构,或者使用C++类来将数据和指针组合在一起。

旁注:<代码> pTrrase>代码4对于元素来说太小了。注意:在C中,数组索引是从代码< 0…n-1 < /代码>,当大小为代码> n< /代码>时。因此,对于大小
3
,索引是
0..2
,因此索引
0..3
需要一个4的数组。您确定不能使用单个指针指向该类型的结构,然后将其解引用到要检索或写入的任何元素吗?我不明白为什么需要一个指针数组…我需要使用这种方法,因为我在一个没有任何通信协议的产品上实现modbus,所以,要通过数字访问结构的变量,使用指针数组更容易。当modbus接收到索引(数字)和值时,通过指针数组,我可以轻松地将值指向结构并在Eokay内更改值,这是有意义的。若您想使用基于索引的访问,那个么使用指向struct的指针是行不通的——您应该按照您的建议只使用数组。因此,使用其他答案中给出的空指针数组。在结构中,我只有char和short数据类型(不介意,上面是一个示例),如果我只需要short数据类型,我如何将char转换为short?你的意思是要将
char
变量分配给
short
变量?是的,当我从指针数组中读取值时,必须是一个短变量
char
to
short
升级保留该值,因此您可以将
char
分配给
short
变量
_letters *ptrLetter;
ptrLetter = &lt;

var1 = ptrLetter->a;