需要指针指针

存储指针地址需要什么?

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

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

A **只是指向指针的指针。 因此,当*p包含*p的地址时, 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); } 

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

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

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

在上面的示例中,您将更改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; } 

现在变化将反映出来!

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

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

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

是否

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

看起来熟悉?

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

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

让我们分配一个矩阵:

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

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

 #include  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