我有一个这样定义的表结构:
typedef struct table {
char *key;
void *value;
} Table;
然后我有这样的事情:
Table **table
作为变量。
这意味着什么?
一组表?
指向表指针的表指针?
指针的指针有不同的用途。我们通常使用的一个例子是在main()
自身的声明中:
int main(int argc, char** argv) {
这是什么意思?
如您所知,argv
为您提供程序运行时使用的参数。每个参数都是一个字符串,你可能知道,一个字符串也是一个char
.
但argv
不是一个字符数组,因为argv
不单独代表一个字符串。argv
是一个数组数组。它能给你带来的不是一根弦,而是多根弦。
的每个元素argv
都是一个char*
,一个数组char
,是许多可能的参数之一。
的表示argv
可以这样描述:
char** argv = {
(char*)"Param 0",
(char*)"Param 1",
(char*)"Param 2",
...
};
指向指针的指针的其他可能用途是当您希望在将其作为参数传递给函数时为其分配一个值。
int
例如,您可以使用像这样的指针将数值分配给 a 的相同方式:
void assign_random_to(int* result) {
*result = rand();
}
int i = 0;
assign_random_to(&i);
// i is now the value of rand()
您可以对指针执行相同的操作,并且在与上述相同的意义上,您将需要一个指向它的指针,一个指向指针的指针:
int try_malloc(void** ptr, int size) {
void* tmp = malloc(size);
if (tmp == NULL)
return 0;
*ptr = tmp;
return 1;
}
char small_buffer[128];
char* buffer = small_buffer;
if (try_malloc(&buffer, 1024))
{
strcpy(buffer, "Big buffer was successfully allocated!");
}
else
{
printf("Failed to alloc a big buffer, original pointer to small buffer preserved.");
}
回答您的评论“好的,但为什么不让 ptr 为 void *ptr 而不是 void **ptr,然后让 ptr = temp?”
因为您不能简单地为参数赋值。
void assign_value_to_parameter(int param) {
param = 2;
// param is now 2, but only in this context
}
int x = 1;
assign_value_to_parameter(x);
// x is still 1, the function did not change its value in this context
函数assign_value_to_parameter()
更改 的值这一事实param
不会影响原始变量的值。这就是为什么你必须传递一个指向某个东西的指针,以便为函数提供改变其值的方法。如果目标已经是指针,则必须将指针传递给该指针。
当您声明Table **table;
时,它会table
生成一个指向Table
;的指针。例如:
Table x;
Table * p = &x;
Table ** table = &p; // points to p
Table * arr[10]; // array of table pointers
table = arr; // point to first element of arr
如果动态分配指针数组,通常会看到双指针。如果每个结构都是单独分配的,您将需要一个数组(或其他数据结构)来保存所有指针。创建一个指针数组会为您提供一个指向 (n 数组) 指针的指针。