C:内存地址数组?
我正在尝试为多个不同的结构创建一种容器。不幸的是,C只允许类型特定的数组,这意味着我必须为每种类型的结构创建不同的数组 我提出的当前解决方案是一个保存内存地址的容器。这样,程序就可以将其中一个元素的内存地址传递给函数 目前我仅有的代码是使用无效指针的失败尝试(遗憾的是,我还不太熟悉指针和内存地址) 以下是我编写的测试代码,旨在尝试了解这些东西是如何工作的:C:内存地址数组?,c,C,我正在尝试为多个不同的结构创建一种容器。不幸的是,C只允许类型特定的数组,这意味着我必须为每种类型的结构创建不同的数组 我提出的当前解决方案是一个保存内存地址的容器。这样,程序就可以将其中一个元素的内存地址传递给函数 目前我仅有的代码是使用无效指针的失败尝试(遗憾的是,我还不太熟悉指针和内存地址) 以下是我编写的测试代码,旨在尝试了解这些东西是如何工作的: void* arr[10]={}; int len=0; int n[5]={1,2,3,4,5}; for (int i=0;i<
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...
}
void*arr[10]={};
int len=0;
int n[5]={1,2,3,4,5};
对于(int i=0;i您需要解除数组中存储的指针的限制。您还需要将其转换为引用对象的原始类型
printf("\t%d\n", *(int *)arr[i]);
您需要解除对数组中存储的指针的限制。您还需要将其强制转换为引用对象的原始类型
printf("\t%d\n", *(int *)arr[i]);
您的方法是正确的,但缺少一些东西
在C语言中,任何对象指针都可以转换为空指针并返回到原始类型的指针。因此,int指针可以转换为空指针,返回到int指针。浮点指针可以转换为空指针,返回到浮点指针
因此,使用一个空指针数组来存储指向不同对象类型的指针是一种很好的方法
但是…为了将void指针转换回原始类型,您需要知道原始类型是什么。如果您只保存void指针,则没有该信息
请考虑类似的事情:
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
}
}
struct gp arr[2];
int n=42;
浮动f=42.42;
arr[0]。p=&n;
arr[0]。类型\标记=整数\类型;
arr[1].p=&f;
arr[1]。type_tag=FLOAT_type;
对于(int i=0;i<2;++i)
{
if(arr[i].type_tag==INT_type)
{
int*p=(int*)arr[i].p;//将void指针转换回int指针
printf(“%d\n”,*p);//使用*p获取int值,即取消对指针的引用
}
else if(arr[i].type_tag==FLOAT_type)
{
int*p=(float*)arr[i].p;//将void指针转换回float指针
printf(“%f\n”,*p);//使用*p获取浮点值,即取消对指针的引用
}
}
您的方法是正确的,但缺少一些东西
在C语言中,任何对象指针都可以转换为空指针并返回到原始类型的指针。因此,int指针可以转换为空指针,返回到int指针。浮点指针可以转换为空指针,返回到浮点指针
因此,使用一个空指针数组来存储指向不同对象类型的指针是一种很好的方法
但是…为了将void指针转换回原始类型,您需要知道原始类型是什么。如果您只保存void指针,则没有该信息
请考虑类似的事情:
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
}
}
struct gp arr[2];
int n=42;
浮动f=42.42;
arr[0]。p=&n;
arr[0]。类型\标记=整数\类型;
arr[1].p=&f;
arr[1]。type_tag=FLOAT_type;
对于(int i=0;i<2;++i)
{
if(arr[i].type_tag==INT_type)
{
int*p=(int*)arr[i].p;//将void指针转换回int指针
printf(“%d\n”,*p);//使用*p获取int值,即取消对指针的引用
}
else if(arr[i].type_tag==FLOAT_type)
{
int*p=(float*)arr[i].p;//将void指针转换回float指针
printf(“%f\n”,*p);//使用*p获取浮点值,即取消对指针的引用
}
}
arr[i]
已经是类型void*
,您不需要强制转换它。这也应该为打印值的问题提供帮助(您打印指针,而不是它可能指向的任何对象)如果您想要一个数组,它可以包含特定的、可枚举类型的对象,那么您可以考虑声明一个<代码>联合/<代码>类型,每个类型都有一个成员,并创建这些联盟的数组。但是,这本身并不能解决知道每个联盟中哪个成员包含值的问题。书面问题,很好的示例代码。建议的改进应该更具体一些。为什么这是一个“失败的尝试”?它不编译(显示错误),不输出您期望的内容(显示输出和您期望的内容),等等。这将邀请更多有用的答案,并帮助其他人回答类似的问题。OT:non of the(void*)
是必需的,它接受函数作为参数。arr[i]
已经是类型void*
,您不需要强制转换它。这也应该会让您了解打印值的问题(您打印的是指针,而不是它可能指向的任何东西)如果您想要一个数组,它可以包含特定的、可枚举类型的对象,那么您可以考虑声明一个<代码>联合/<代码>类型,每个类型都有一个成员,并创建这些联盟的数组。但是,这本身并不能解决知道每个联盟中哪个成员包含值的问题。书面问题,很好的示例代码。建议的改进应该更具体一些。为什么这是一个“失败的尝试”?它不编译(显示错误),不输出您期望的内容(显示输出和您期望的内容),等等。这将邀请更多有用的答案,并帮助其他人回答类似的问题。OT:non of the(void*)
是必需的。这样做的方式是它接受一个函数作为参数。如果内存地址引用不同的类型(例如,两个不同的结构)在不知道原始类型的情况下,如何将其强制转换为原始类型?@xcdev您无法知道空指针指向的是什么类型。您需要以某种方式存储该信息。如果内存地址引用了d,则无法做到这一点