我见过一个字符串数组的指针,定义如下
#include <stdio.h>
int main()
{
char * testArray[sizeof(unsigned int) * 8][2]=
{
[0] = {"Test", "Index 0"},
[1] = {"Test", "Index 1 "},
[2] = {"Test", "Index 2"},
[3] = {"Test", "Index 3"},
[4] = {"Test", "Index 4"},
[5] = {"Test", "Index 5"},
};
int i;
for (i = 0 ; i < 6; i++)
printf("%s\n",testArray[i][1]); //Prints Index 0-5
for (i = 0 ; i< 6; i++)
printf("%s\n",testArray[i][0]); //Prints Test
}
我对这种数组声明和索引的方式不熟悉。谁能解释一下这种索引和代码是如何工作的?
就像现在这样,它什么都不做,和有一样。
{"Test", "Index 0"},
{"Test", "Index 1"},
{"Test", "Index 2"},
{"Test", "Index 3"},
{"Test", "Index 4"},
{"Test", "Index 5"},
但是你可以使用这些索引来为初始化中的行排序,比如说。
[5] = {"Test", "Index 0"},
[1] = {"Test", "Index 1"},
[0] = {"Test", "Index 2"},
[3] = {"Test", "Index 3"},
[4] = {"Test", "Index 4"},
[2] = {"Test", "Index 5"},
这里对数组进行了重新排序, 通常情况下索引0会变成索引5, 索引2会变成索引0, 索引5会变成索引2.
表达式
char *testArray[sizeof(unsigned int) * 8][2]
宣告一个指向char的二维指针数组,其大小为8倍的 unsigned int
的行和2列,因为在大多数系统中,一个是 int
有4个字节大小,你将最终得到一个32行2列的二维数组。
每一个指针都可以分配一个char数组,这意味着32行中的每一行都可以有2个char数组,每列一个。
你的二维数组可以容纳32×2个char数组,这对于你所需要的赋值来说太多。
你可以声明第一个维度为空,它会被编译器推导出来。
char *testArray[][2]= ...
或者明确地给它你所需要的维度,在本例中是6:
char *testArray[6][2]= ...
在本例中是6. [N]
在 [N] = {"Test", "Index N"}
用于访问特定行级的二维指针,以获取到 char
阵列 testArray
.
举例来说。
char * testArray[6][2]=
{
[5] = {"Test1", "Index 5"},
[4] = {"Test2", "Index 4"},
[3] = {"Test3", "Index 3"},
[2] = {"Test4", "Index 2"},
[1] = {"Test5", "Index 1"},
[0] = {"Test6", "Index 0"},
};
将会打印。
Index 0
Index 1
Index 2
Index 3
Index 4
Index 5
Test6
Test5
Test4
Test3
Test2
Test1
不同的是,具体初始化的顺序并不重要。你可以随心所欲地重新排列它们,它仍将等同于。
char * testArray[6][2] =
{
{"Test6", "Index 0"},
{"Test5", "Index 1"},
{"Test4", "Index 2"},
{"Test3", "Index 3"},
{"Test2", "Index 4"},
{"Test1", "Index 5"},
};
侧记。
你应该定义 testArray
作为 const char * testArray
这样你就不会因为任何无意的写入尝试而进入未定义的行为,因为所有分配的指针都指向字符串字面,而这些字面是不能被修改的。
为什么你要使用 [sizeof(unsigned int) * 8]
来确定行?你只需要 6
行。使用 const char * testArray[6][2]
而不是。