将一般深度的嵌套指针传递给 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
 }

另一方面,我认为您在这里制造了自己的问题,也许首先需要问问您为什么需要这样做。您认为这将解决什么实际问题?