我正在尝试编码来自结构的变量的指针数组。我的问题是结构内部的变量具有不同的数据类型。
#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] = <.a;
ptrLetters[1] = <.b;
ptrLetters[2] = <.c; //here is the problem
ptrLetters[3] = <.d; //also here
var1 = (int)*ptrLetters[0];
Serial.println(var1);
}
这样做的目的是因为我想通过数组的索引(* ptrLetters [index])保存地址并从struct(我无法修改)访问结构中的变量,但是问题是内部struct有不同的数据类型,并且指针仅针对char类型进行初始化。 如何动态更改呢?
答案 0 :(得分:0)
您可以使用无效(未类型化)指针数组:
void *ptrLetters[4];
ptrLetters[0] = <.a;
ptrLetters[1] = <.b;
ptrLetters[2] = <.c; //here is the problem
ptrLetters[3] = <.d; //also here
然后您可以像这样访问变量:
var1 = *((char*)ptrLetters[0]);
请注意,必须先将void指针转换回原始类型,以进行取消引用。然后,在赋值时隐式执行到int的转换。
答案 1 :(得分:0)
任何类型为的对象的指针都可以隐式转换为pointer to void (可选,通过cv限定);指针值不变。需要
static_cast
或显式强制转换的反向转换将产生原始指针值:
void *ptrLetters[4];
ptrLetters[0] = <.a;
ptrLetters[1] = <.b;
ptrLetters[2] = <.c; //no more problem
ptrLetters[3] = <.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 = <
var1 = ptrLetter->a;
您还可以探索指针的结构,或使用C ++类将数据和指针包含在一起。