[英]Dynamically change the data type of an array of pointers to a 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] = <.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]) 保存地址並訪問結構中的變量(我無法修改),但問題是在結構內部是不同的數據類型,指針僅針對 char 類型初始化。 我如何動態改變它?
指向任何類型對象的指針都可以隱式轉換為指向 void 的指針(可選 cv 限定); 指針值不變。 需要
static_cast
或顯式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]));
您可以使用 void(無類型)指針數組:
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 的轉換。
您還沒有解釋為什么只想使用指針數組或為什么要使用指針。 根據您在示例代碼中嘗試執行的操作,您可以通過多種方式進行操作。
最簡單的方法是使用指向結構的指針:
_letters *ptrLetter;
ptrLetter = <
var1 = ptrLetter->a;
您還可以探索指針結構或使用 C++ 類來包含數據和指針。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.