存储指针地址需要什么?
int a = 2;
int *p = &a;
int **q = &p;
有实际用途吗?实时应用程序。
答案 0 :(得分:22)
在C中,您可以传递对象的“值”或“地址”。如果在函数调用中传递值,则函数中所做的更改不会反映在调用位置。要反映更改,您需要传递对象的地址,例如:
void insert(node* head){
head->data = 10; // address(or head) is still same
}
按对象我的意思是任何类型的int,char或struct,例如节点
在上面的示例中,您更改了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;
}
现在变化将反映出来!
关键是,如果地址是你的值(需要更新地址),那么你需要使用地址指针,或者我应该说指针的指针来反映调用地点的变化。
因为你的问题是需要指针的指针,还有一个地方指向指向array of string和dynamic 2-D arrays的指针,为了同样的用途,你可能需要指向指向指针的指针例如dynamic matrix of String or/ 3D char array。
另请阅读:Pointers to Pointers我刚刚找到,告诉你一个例子。
答案 1 :(得分:9)
**
只是指向指针的指针。因此,*p
包含p
的地址时,p**
包含p*
的地址,其中包含p
对象的地址。
**
用于希望在功能调用之外保留内存分配或分配。
同时检查此article。
示例: - 强>
void allocate(int** p)
{
*p = (int*)malloc(sizeof(int));
}
int main()
{
int* p = NULL;
allocate(&p);
*p = 1;
free(p);
}
答案 2 :(得分:4)
int main (int argc, char** argv) { ... }
看起来很熟悉?
答案 3 :(得分:3)
如果要在其他函数中分配N阶指针,则应使用第(N + 1)阶指针。例如:
void allocate_matrix(int ***ptr, int x, int y);
让我们分配一个矩阵:
int **matrix:
allocate_matrix(&matrix, 5, 5);
答案 4 :(得分:1)
这样做的一个用途是从函数中更改指针的值。例如:
#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