将一般深度的嵌套指针传递给 C 中的函数
Pass nested pointers of general depth to a function in C
我如何在 C 中声明一个接受可变深度的嵌套指针的函数?
例如,函数应该接受int*
或int**
或int***
等。
我认为我的函数签名将使用 void
,但我不知道如何转换回...类型的指针的指针。
这是我想要实现的非一般性示例
void myfunc(void* obj, int dim) {
if (dim == 1) {
int* myobj1 = (int*) obj;
// do stuff with myobj1
} else if (dim == 2) {
int** myobj2 = (int**) obj;
// do stuff with myobj2
}
// ad infinitum
知道 C 是静态类型的,这完全可能吗?
嗯,不——除了你展示的,你无法用任何东西实现这一点。(你说的是任何间接级别——可变深度的嵌套指针)。现在更重要的问题是你为什么需要它?我会说你试着组织一下你的想法。 3 星程序员被告知要避免这件事。 (使用 ***
)。
一个解决方案是使用void*
(您也以某种方式展示了它)并添加一个参数,该参数将让您知道函数内部的间接级别。 这是你能做的最好的了。
C中没有"nested pointers",有引用数据类型为其他指针类型的指针,但认为"nesting"很可能会误入歧途。
但是话虽如此,您提出的方法有什么问题?你试过了吗?任何指针都可以转换为 void *
并返回其原始类型而不更改其值。这可能是您的嵌套想法误入歧途的一个地方:同样适用于 int *
、int **
、int ***
。都是指针类型。所有都可以转换为 void *
并返回就好了。
但是,转换为类型 void *
后,结果值不包含有关原始类型的任何信息。如果您希望能够转换回来,则需要单独传达它,例如您使用 dim
参数。
递归怎么样:
void myfunc(void* obj, int dim) {
int* myobj1 = (int*) obj;
if (dim > 1)
{
myfunc(*myobj1, dim-1);
}
else {
// do stuff with myobj1
}
另一方面,我认为您在这里制造了自己的问题,也许首先需要问问您为什么需要这样做。您认为这将解决什么实际问题?
我如何在 C 中声明一个接受可变深度的嵌套指针的函数?
例如,函数应该接受int*
或int**
或int***
等。
我认为我的函数签名将使用 void
,但我不知道如何转换回...类型的指针的指针。
这是我想要实现的非一般性示例
void myfunc(void* obj, int dim) {
if (dim == 1) {
int* myobj1 = (int*) obj;
// do stuff with myobj1
} else if (dim == 2) {
int** myobj2 = (int**) obj;
// do stuff with myobj2
}
// ad infinitum
知道 C 是静态类型的,这完全可能吗?
嗯,不——除了你展示的,你无法用任何东西实现这一点。(你说的是任何间接级别——可变深度的嵌套指针)。现在更重要的问题是你为什么需要它?我会说你试着组织一下你的想法。 3 星程序员被告知要避免这件事。 (使用 ***
)。
一个解决方案是使用void*
(您也以某种方式展示了它)并添加一个参数,该参数将让您知道函数内部的间接级别。 这是你能做的最好的了。
C中没有"nested pointers",有引用数据类型为其他指针类型的指针,但认为"nesting"很可能会误入歧途。
但是话虽如此,您提出的方法有什么问题?你试过了吗?任何指针都可以转换为 void *
并返回其原始类型而不更改其值。这可能是您的嵌套想法误入歧途的一个地方:同样适用于 int *
、int **
、int ***
。都是指针类型。所有都可以转换为 void *
并返回就好了。
但是,转换为类型 void *
后,结果值不包含有关原始类型的任何信息。如果您希望能够转换回来,则需要单独传达它,例如您使用 dim
参数。
递归怎么样:
void myfunc(void* obj, int dim) {
int* myobj1 = (int*) obj;
if (dim > 1)
{
myfunc(*myobj1, dim-1);
}
else {
// do stuff with myobj1
}
另一方面,我认为您在这里制造了自己的问题,也许首先需要问问您为什么需要这样做。您认为这将解决什么实际问题?