【问题标题】:Initializing values at the end of a pointer to pointer to pointer chain在指向指针链的指针的指针末尾初始化值
【发布时间】:2013-04-01 15:45:42
【问题描述】:

好吧,我整天都在忙这个(不是硬件),虽然它可能不是特别有用的代码,但它是一个简洁的概念性东西。我试图找出在末尾设置值的最佳方法,因为没有更好的名称,指向指针链的指针。例如,我声明:

int *****ptr;

将每个指针设置为指针段的最佳方法是什么,一直到实际的 int 值?

此代码无法编译,因为它不喜欢我使用和取消引用 void 指针的方式:

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

#define NUMPOINTERS 5

int main(int argc, char **argv)
{
    int *****number;
    *****number = malloc(sizeof(void*));
    void *ptr = *number;

    int i;

    for(i = 1; i < NUMPOINTERS; i++)
    {
        if(i == NUMPOINTERS - 1)
        {
            ptr = malloc(sizeof(int));
            int *iPtr = (int*)ptr;
            *iPtr = 900;
            break;
        }

        *ptr = malloc(sizeof(void*));
        ptr = **ptr;
    }

    printf("%d", *****number);

    return 0;

}

是否有一些文章讨论了指向指针的荒谬数量以及如何使用它们?

【问题讨论】:

    标签: c pointers gcc


    【解决方案1】:

    你所拥有的非常接近。不过,您可能想从内到外工作。这是一个基于您的程序的完整示例(内联 cmets):

    #include <stdio.h>
    #include <stdlib.h>
    
    #define NUMPOINTERS 5
    
    int main(void)
    {
        void *ptr = malloc(sizeof(int)); // allocate space for the integer value
        *(int *)ptr = 900;               // initialize it 
    
        // iterate to create the nested pointers
        for (int i = 1; i < NUMPOINTERS; i++)
        {
            void **newptr = malloc(sizeof(void *)); // create a new pointer
            *newptr = ptr;                          // point it at what we have so far
            ptr = newptr;                           // "step out" one level
        }
    
        int *****number = ptr;        // make our 'int *****' pointer
        printf("%d\n", *****number);  // dereference and print the pointed-to value
    
        return 0;
    }
    

    【讨论】:

    • 你是英雄,谢谢!这是我不会做任何其他事情的事情之一,只是盯着屏幕看。我不知道你可以完成程序第 9 行这样的作业。
    • 一个简单的问题。当你这样写一行时: int *pointer = someOtherPtr;指针将采用 someOtherPtr 指向的地址,而不仅仅是指向该指针,因为它不是指向指针的指针。然而,一个 void 指针可以指向它想要的任何东西。它没有类型。因此,当您使用 '=' 运算符将指针分配给 void 指针时,编译器如何决定是指向指针还是指向它所指向的内容,因为 void 指针可以指向指针或仅指向值?即:ptr = newptr;
    • 如果没有&amp;* 运算符,则pointersomeOtherPtr 都指向同一个内存位置。 void * 指针也是如此。所以对于void *p = q;pq 都指向同一个内存位置。对于void *p = &amp;qp 指向q 本身。
    • 不,****number 指向 intnumber 指向*number*number 指向**number**number 指向***number***number 指向****number。否则,printf 调用中的 *****number 取消引用将如何工作?
    • @Matt,是的,没错。但是,该代码不会在没有警告的情况下编译。您将变量声明为与它无关。如果您没有足够的间接次数,那么您最终不会得到匹配的数据结构。也许您应该在调试器中查看其中的一些构造?