是*hold_array[]
一个指针数组。该函数get_array
返回单个指针,尽管返回的指针是指向指针数组的char *
指针。但是,您不能声明*hold_array[]
为没有任何维度的指针数组。编译器不知道要为其分配多少空间。它不知道您需要多少指针。
您可以将其声明为**hold_array
. 这是一个指向指针数组的单个指针。我知道听起来一样,但不完全一样。在*hold_array[]
您分配多个指针的情况下,因此需要一个维度。在**hold_array
您分配一个指向指针数组的指针的情况下。在您的初始化程序static char *array[]
中,编译器会看到您需要两个指针,并在内部为您将其标注为*array[2]
.
因此,main()
您要求编译器创建一个由char *
指针组成的未知维度数组。该函数get_array
返回指针数组的地址,但不返回数组中的各个指针。请记住,它array[0]
是指向字符串的指针"test1"
,array[1]
也是指向字符串的指针"test2"
。字符串本身是字符数组,末尾有一个 0 字节。
另一种思考方式是:
char *test1 = "test1";
char *test2 = "test2";
char *array[2];
char **hold_array;
array[0] = test1;
array[1] = test2;
hold_array = array;
printf("\n%s = %s", hold_array[0], array[0]); //print the same string
因此,当您返回时array
,编译器假定您指的是数组本身,因为您没有另外指定数组的成员。所以只array
返回自身的地址。这与 相同**hold_array
。这意味着hold_array = array
。**hold_array
是指向指针数组的单个指针。array[2]
是一个指针数组,为 2 个指针分配空间。