需要指针指针

时间:2013-08-19 05:32:39

标签: c pointers

存储指针地址需要什么?

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

有实际用途吗?实时应用程序。

5 个答案:

答案 0 :(得分:22)

在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 :(得分:9)

**只是指向指针的指针。因此,*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);
}

答案 2 :(得分:4)

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

看起来很熟悉?

答案 3 :(得分:3)

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

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

让我们分配一个矩阵:

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

答案 4 :(得分:1)

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

#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