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