是否可以在运行时使用C确定指针的间接寻址级别?

是否可以在运行时使用C确定指针的间接寻址级别?,c,pointers,C,Pointers,是否可以声明指向-…-指向-[data type]的指针,其间接寻址级别在运行时确定 这是一个思维实验;我知道这可能是一种糟糕的做法,我并不打算实际使用它做任何事情。但我花了几个小时思考它,滥用预处理器宏,结果是空的,所以我很好奇是否有人能想出如何做到这一点: 编写一个程序,将stdin中的intm(最多255个)作为输入,并声明指向int的m级间接指针。i、 e.如果输入为4,则应声明int****x在main()的顶级范围内,不能在运行时更改声明。但你可以这样做: #include <

是否可以声明指向-…-指向-[data type]的指针,其间接寻址级别在运行时确定

这是一个思维实验;我知道这可能是一种糟糕的做法,我并不打算实际使用它做任何事情。但我花了几个小时思考它,滥用预处理器宏,结果是空的,所以我很好奇是否有人能想出如何做到这一点:


编写一个程序,将
stdin
中的
int
m
(最多255个)作为输入,并声明指向
int
m
级间接指针。i、 e.如果输入为4,则应声明
int****x
main()

的顶级范围内,不能在运行时更改声明。但你可以这样做:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int
main(int argc, char **argv)
{
        int count = argc > 1 ? strtol(argv[1], NULL, 0) : 5;
        int d = argc > 2 ? strtol(argv[2], NULL, 0) : 10;
        void *f[10];
        int dereferenced;

        if( count > 5 ) {
                fprintf(stderr, "levels of direction must be <= 5\n");
                exit(EXIT_FAILURE);
        }

        f[0] = &d;
        for(int i = 1; i < 10; i++) {
                f[i] = f + i - 1;
        }
        switch(count) {
        case 1:dereferenced = *(int *)f[0];
        case 2:dereferenced = **(int **)f[1];
        case 3:dereferenced = ***(int ***)f[2];
        case 4:dereferenced = ****(int ****)f[3];
        case 5:dereferenced = *****(int *****)f[4];
        }
        printf ("%d\n", dereferenced);
}
#包括
#包括
#包括
int
主(内部argc,字符**argv)
{
int count=argc>1?strtol(argv[1],NULL,0):5;
intd=argc>2?strtol(argv[2],NULL,0):10;
无效*f[10];
int解引用;
如果(计数>5){

fprintf(标准,"方向的级别必须是C语言中对此没有特别的支持。它可以通过编写自己的例程在重复的解引用和转换中进行迭代来实现。在实用软件中通常不需要它。@EricPostChil我知道。我只是想看看实现,因为我怀疑我会在不要这样做。你总是可以强制转换、取消引用和再次强制转换。这甚至不难。我甚至不知道你为什么要这样做。
void*x=y;x=(void*)*x;
等。C是一种静态类型的语言。你不能在运行时创建新类型。你可以用
union PP{PP*next;int*last;}
虽然不是celar,但首先你为什么需要这个。问题出现在需要多个类型时:DYea,switch方法是可行的。我想知道是否有一种方法可以做到这一点,而基本上不需要做出所有可能的声明,然后选择你想要的。答案似乎是否定的。谢谢!这导致viola的UB使用严格的别名规则。案例2应该是
*(int*)*(void**)f[1]
,依此类推