正在学习C语言,所以请耐心听我说。我知道char *argv[]
是一个数组,它的元素是指向字符串的指针。例如:
char *fruits[] = {"Apple", "Pear"};
表示一个"不规则数组"。char
数组(即行长度不同的二维数组)。到目前为止,一切顺利。
但是当我尝试将其抽象为int类型时,它似乎不起作用。
int *numbers[] = { {1,2,3}, {4,5,6} };
我从GCC编译器得到以下警告:
谁能帮我想想这个?警告:大括号环绕标量初始化式。
int *numbers[] = { {1,2,3}, {4,5,6} }
不能工作,您正在尝试用整数列表初始化指针数组的元素。
要初始化一个指针数组,需要提供指向所需值的地址,即您必须初始化指针数组的每个元素,其中包含您希望它们指向的int
的地址,在本例中是int
数组的初始元素,以便您可以访问数组的开头,从而通过索引访问数组的其余部分:
//have 2 flat arrays of int
int a[] = {1, 2, 3};
int b[] = {4, 5, 6};
// make the array of pointers point to its initial elements
int *numbers[] = { &a[0], &b[0] };
// access
printf("%d", numbers[1][1]); // 5
你也可以使用:
int *numbers[] = { a, b };
为什么?因为当你在表达式中使用数组名时,例如你将其作为函数的参数或像上面这样的初始化列表传递,它会衰减为指向其第一个元素的指针。
char *fruits[] = {"Apple", "Pear"};
工作得很好,因为字符串字面值的类型通常是char[]
,例如"Apple"
具有类型char[6]
,因此当您在初始化列表表达式中使用它们时,会发生相同的衰减过程,并且您将最终得到指向以null结尾的字符数组的第一个元素的指针。
请注意,与上面的字符串字面值(它们都以空字节