c中int的不规则数组



正在学习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结尾的字符数组的第一个元素的指针。

请注意,与上面的字符串字面值(它们都以空字节结束)不同,int数组没有哨兵值,除非您建立一个哨兵值,否则为了在每个数组的边界内安全导航,您必须跟踪其大小。

int *numbers[]不是"粗糙数组"只有一个指针数组。

int *numbers[] = { (int[]){1,2,3}, (int[]){4,5,6,7,8} };

在本例中,它有两个类型指针指向int的元素。这些指针保存了用于初始化它的数组的第一个元素的引用。

最新更新