存储指针地址需要什么?
int a = 2;
int *p = &a;
int **q = &p;
有什么实际用途吗?实时应用。
在 C 中,您可以传递对象的“值”或“地址”。如果您在函数调用中传递值,则函数中所做的更改不会反映在调用位置。为了反映变化,您需要传递对象的地址,例如:
void insert(node* head){
head->data = 10; // address(or head) is still same
}
对象 I 表示任何类型的 int、char 或 struct,例如节点
在上面的示例中,您通过head
指针更改值,并且data
将反映更改。
但是假设如果你想head
在你的列表中改变自己(例如插入新节点作为第一个节点)。
void insert(node* head){
head = malloc(sizeof(head)); // head changed
head->data = 10;
}
然后值不会反映在调用位置,因为head
函数中的 this 与head
调用位置不同。
你有两个选择,要么return head
使用pointer to pointer
(但记住只能返回一个值)。
使用指向指针的指针:
void insert(node** head){
(*head) = malloc(sizeof **head);
(*head)->data = 10;
}
现在变化将反映出来!
关键是,如果地址是您的值(需要更新地址),那么您需要使用地址指针,或者我应该说指针指针来反映调用位置的更改。
由于您的问题是指针指针的需要,在string 数组和动态二维数组中使用指针指针的另一个地方,并且对于相同的用途,您可能需要指针指针,例如String 的动态矩阵或/ 3D 字符数组。
另请阅读:Pointers to Pointers I just found,举个例子。
A**
只是一个指向指针的指针。因此,其中 an*p
包含 an 的地址,p
其中包含 an 的地址p**
,该地址p*
包含p
对象的地址。
**
当您想要在函数调用之外保留内存分配或分配时使用。
还要检查这篇文章。
例子:-
void allocate(int** p)
{
*p = (int*)malloc(sizeof(int));
}
int main()
{
int* p = NULL;
allocate(&p);
*p = 1;
free(p);
}
做
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 <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