存储指针地址需要什么?
int a = 2;
int *p = &a;
int **q = &p;
有什么实际用途吗?实时应用。
int a = 2;
int *p = &a;
int **q = &p;
有什么实际用途吗?实时应用。
在 C 语言中,你可以传递一个对象的 "值" 或者 "地址"。如果在函数调用时传递的是值,那么在函数内部做出的更改将不会反映在调用的地方。如果要反映更改,你需要传递对象的地址,例如:
void insert(node* head){
head->data = 10; // address(or head) is still same
}
在这里,"object"指的是任何类型的int、char或struct,例如node
在上面的例子中,如果你改变由head
指针引用的地址的值,那么data
中的更改将被反映。
但是,假设你想改变列表中的head
本身(例如将新节点插入为第一个节点)。
void insert(node* head){
head = malloc(sizeof(head)); // head changed
head->data = 10;
}
由于函数中的head
与调用位置的head
不同,因此值在调用位置不会反映。
你有两个选择,要么return head
,要么使用指向指针
(但记住只能返回一个值)。
使用指向指针:
void insert(node** head){
(*head) = malloc(sizeof **head);
(*head)->data = 10;
}
现在更改将反映出来!
关键是,如果地址是您的值(需要更新地址),那么您需要使用地址的指针或者我应该说是指向指针的指针,以便在调用位置反映出更改。
正如您的问题所在,指针到指针的需求还有另一个地方,即字符串数组和动态二维数组,并且为了同样的用途,您可能需要指向指针的指针,例如动态矩阵的字符串或3D字符数组。
也可以阅读这篇文章:指针到指针,我只是找到了一个例子告诉您。
**
只是指向指针的指针。所以,*p
包含一个p
的地址,而p**
包含一个p*
的地址,这个p*
又包含一个p
对象的地址。
**
用于在函数外部保留内存分配或赋值。
还可以查看这篇文章。
示例:
void allocate(int** p)
{
*p = (int*)malloc(sizeof(int));
}
int main()
{
int* p = NULL;
allocate(&p);
*p = 1;
free(p);
}
Does
int main (int argc, char** argv) { ... }
看起来很熟悉吗?
如果你想在另一个函数中分配Nth顺序指针,你应该使用(N+1)th顺序指针。例如:
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
main(int argc, char ** argv)
。 - glglgl