【问题标题】:Need of Pointer to pointer需要指针指向指针
【发布时间】:2013-08-19 05:32:39
【问题描述】:

存储指针地址需要什么?

  int a = 2;
  int *p = &a;
  int **q = &p;

有什么实际用途吗?实时应用。

【问题讨论】:

标签: c pointers


【解决方案1】:

在 C 中,您可以传递对象的“值”或“地址”。如果您在函数调用中传递值,则函数中所做的更改不会反映在调用位置。为了反映变化,你需要传递对象的地址,例如:

void insert(node* head){
   head->data = 10;    // address(or head) is still same 
}

我所说的对象是指任何类型的 int、char 或 struct,例如节点

在上面的示例中,您更改了head 指针所寻址的值,data 中的更改将被反映。

但是假设如果您想在列表中更改head 本身(例如,插入新节点作为第一个节点)。

void insert(node* head){
   head = malloc(sizeof(head));  // head changed 
   head->data = 10;
}

那么值不会反映在调用位置,因为函数中的这个head与调用位置的head不同。

您有两个选择,return head 或使用pointer to pointer(但请记住只能返回一个值)。

使用指针指向指针:

void insert(node** head){
   (*head) = malloc(sizeof **head);   
   (*head)->data = 10;
}

现在变化会体现出来!

关键是,如果地址是你的值(需要更新地址),那么你需要使用地址指针或者我应该说指针指针来反映调用位置的变化。

由于您的问题是指针指针的需要,在array of stringdynamic 2-D arrays 中使用的指针指针的另一个位置,并且对于相同的用途,您可能需要指向指针的指针,例如dynamic matrix of String or/ 3D char array .

另请阅读:Pointers to Pointers我刚刚找到,告诉你一个例子。

【讨论】:

  • 考汉:+1。很好的答案。实际上,仅在链接列表中我使用了相同的。
  • 这正好回答了被问到的问题,但它只是它使用的一个方面+1 :)
  • 应该是 (* head) 而不是 (head * )
  • @GrijeshChauhan:是的,周围有 很多 糟糕的 Java 书籍。同样的 C#,它更令人困惑,因为 C# 确实 有通过引用传递,它只是默认不使用它。感谢您更正答案。
  • @GrijeshChauhan:是的,有 - 以 C# 为例。见pobox.com/~skeet/csharp/parameters.html
【解决方案2】:

** 只是一个指向指针的指针。所以*p 包含p 的地址,p** 包含p* 的地址,而p* 包含p 对象的地址。

** 用于即使在函数调用之外也要保留内存分配或分配

也可以查看article

示例:-

void allocate(int** p)
{
  *p = (int*)malloc(sizeof(int));
}

int main()
{
  int* p = NULL;
  allocate(&p);
  *p = 1;
  free(p);
}

【讨论】:

  • @Rahul Tripathi:他说的是实际用途??
  • @pranitkothari:- 用实际用途更新了我的答案。希望现在有意义;)
【解决方案3】:

int main (int argc, char** argv) { ... }

看起来很眼熟?

【讨论】:

  • 是的,我认为最常见的地方是我们需要指向指针的指针,+ 用于发布非常有用的示例。
【解决方案4】:

如果你想在其他函数中分配N阶指针,你应该使用(N+1)阶指针。例如:

void allocate_matrix(int ***ptr, int x, int y);

让我们分配一个矩阵:

int **matrix:
allocate_matrix(&matrix, 5, 5);

【讨论】:

    【解决方案5】:

    这样做的一个用途是在函数内更改指针的值。例如:

    #include <stdio.h>
    
    void swapStrings(const char **strA, const char **strB)
    {
        const char *tmp = *strB;
        *strB = *strA;
        *strA = tmp;
    }
    
    int main()
    {
        const char *a;
        const char *b;
        a = "hello";
        b = "world";
        swapStrings(&a,&b);
        // now b points to "hello" and a points to "world"
        printf("%s\n", a);
        printf("%s\n", b);
    }
    

    输出:

    world
    hello
    

    【讨论】:

    • wayne , U 可以使用 realloc 来增加分配的内存。
    • Rahul,在什么情况下我们需要在函数调用之外保留内存。
    • 而且也不会破坏原始值。
    • @GopsAB 这很难回答。如果你遇到这样的情况,你会看到的。简而言之,只要你想指向指向其他地方的东西,你就需要它。也许看看指针数组;它们也衰减成指针的指针。
    • 好吧,这是一个糟糕的例子。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-04
    • 1970-01-01
    • 2010-10-28
    • 1970-01-01
    • 1970-01-01
    • 2018-05-16
    相关资源
    最近更新 更多