我正在尝试为多个不同的结构制作一种容器。不幸的是,C 只允许类型特定的数组,这意味着我必须为每种类型的结构创建一个不同的数组。
我提出的当前解决方案是一个保存内存地址的容器。这样,程序就可以将其中一个元素的内存地址传递给函数。
目前我唯一的代码是使用 void 指针的失败尝试(不幸的是,我对指针和内存地址并不是很熟悉)
以下是我编写的测试代码,试图了解这些东西是如何工作的:
void* arr[10]={};
int len=0;
int n[5]={1,2,3,4,5};
for (int i=0;i<5;i++) { //add pointers nums in n to arr
arr[i]=(void*)(&n[i]);
len++;
}
for (int i=0;i<len;i++) { //print contents of arr
printf("%p\n", (void*)arr[i]);
printf("\t%d\n", arr[i]); //trying to print actual value (eg. 2 for index 2) but not really sure how to...
}
谢谢!
您的方法是正确的,但缺少一些东西......
在 C 中,任何对象指针都可以转换为空指针并返回原始类型的指针。因此,可以将整型指针转换为空指针并返回整型指针。并且可以将浮点指针转换为空指针并返回浮点指针。
因此,使用空指针数组来存储指向不同对象类型的指针是一种很好的方法。
但是...为了将空指针转换回原始类型,您需要知道原始类型是什么。如果您只是保存空指针,则没有该信息。
而是考虑以下内容:
struct gp
{
void* p;
unsigned type_tag;
}
#define INT_TYPE 0
#define FLOAT_TYPE 1
并使用它:
struct gp arr[2];
int n = 42;
float f = 42.42;
arr[0].p = &n;
arr[0].type_tag = INT_TYPE;
arr[1].p = &f;
arr[1].type_tag = FLOAT_TYPE;
for (int i=0; i < 2; ++i)
{
if (arr[i].type_tag == INT_TYPE)
{
int* p = (int*)arr[i].p; // Cast void-pointer back to int-pointer
printf("%d\n", *p); // Get int-value using *p, i.e. dereference the pointer
}
else if (arr[i].type_tag == FLOAT_TYPE)
{
int* p = (float*)arr[i].p; // Cast void-pointer back to float-pointer
printf("%f\n", *p); // Get float-value using *p, i.e. dereference the pointer
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句