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

时间:2018-11-15 09:29:49

标签: 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.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])保存地址并从struct(我无法修改)访问结构中的变量,但是问题是内部struct有不同的数据类型,并且指针仅针对char类型进行初始化。 如何动态更改呢?

3 个答案:

答案 0 :(得分:0)

您可以使用无效(未类型化)指针数组:

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的转换。

答案 1 :(得分:0)

  

任何类型为的对象的指针都可以隐式转换为pointer to void (可选,通过cv限定);指针值不变。需要static_cast或显式强制转换的反向转换将产生原始指针值:

void *ptrLetters[4];
ptrLetters[0] = &lt.a;
ptrLetters[1] = &lt.b;
ptrLetters[2] = &lt.c;   //no more problem
ptrLetters[3] = &lt.d;  //no more problem here as well

要取消引用,在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 ++中使用static_cast

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]));

答案 2 :(得分:0)

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

最简单的方法是使用指针来构造:

_letters *ptrLetter;
ptrLetter = &lt;

var1 = ptrLetter->a;

您还可以探索指针的结构,或使用C ++类将数据和指针包含在一起。