需要指针指针

Gib*_*bbs 9 c pointers

存储指针地址需要什么?

  int a = 2;
  int *p = &a;
  int **q = &p;
Run Code Online (Sandbox Code Playgroud)

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

Gri*_*han 23

在C中,您可以传递对象的"值"或"地址".如果在函数调用中传递值,则函数中所做的更改不会反映在调用位置.要反映更改,您需要传递对象的地址,例如:

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

对象我指的是任何类型的int,char或struct,例如node

在上面的示例中,您将更改head指针所处的值,data并将反映更改.

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

void insert(node* head){
   head = malloc(sizeof(head));  // head changed 
   head->data = 10;
}
Run Code Online (Sandbox Code Playgroud)

然后值不会反映在调用位置,因为这head在函数中与head调用位置不同.

你有两个选择,return head或者使用pointer to pointer(但是记住只有一个值可以返回).

使用指针指针:

void insert(node** head){
   (*head) = malloc(sizeof **head);   
   (*head)->data = 10;
}
Run Code Online (Sandbox Code Playgroud)

现在变化将反映出来!

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

因为你的问题是需要指针的指针,还有一个指向指针指向字符串动态2-D数组的指针,并且为了相同的用途,你可能需要指向指向指针的指针,例如String的动态矩阵或/ 3D char数组.

另请阅读:我刚刚找到指针指针,告诉你一个例子.


Rah*_*thi 11

A **只是指向指针的指针.因此,如果*p包含a的地址p,则p**包含p*包含p对象地址的地址.

**当您想要在函数调用之外保留Memory-Allocation或Assignment时使用.

另请查看这篇文章.

例:-

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

int main()
{
  int* p = NULL;
  allocate(&p);
  *p = 1;
  free(p);
}
Run Code Online (Sandbox Code Playgroud)