簡體   English   中英

動態更改指向結構的指針數組的數據類型

[英]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] = &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]) 保存地址並訪問結構中的變量(我無法修改),但問題是在結構內部是不同的數據類型,指針僅針對 char 類型初始化。 我如何動態改變它?

指向任何類型對象的指針都可以隱式轉換為指向 void 的指針(可選 cv 限定); 指針值不變。 需要static_cast或顯式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]));

您可以使用 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 的轉換。

您還沒有解釋為什么只想使用指針數組或為什么要使用指針。 根據您在示例代碼中嘗試執行的操作,您可以通過多種方式進行操作。

最簡單的方法是使用指向結構的指針:

_letters *ptrLetter;
ptrLetter = &lt;

var1 = ptrLetter->a;

您還可以探索指針結構或使用 C++ 類來包含數據和指針。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM