需要指针指针
存储指针地址需要什么?
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