在下面的代码中,字符指针的阵列声明看起来有所不同

问题描述 投票:0回答:1

我见过一个字符串数组的指针,定义如下

#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
}

我对这种数组声明和索引的方式不熟悉。谁能解释一下这种索引和代码是如何工作的?

c arrays pointers compilation
1个回答
1
投票

就像现在这样,它什么都不做,和有一样。

{"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]= ...

0
投票

在本例中是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] 而不是。

© www.soinside.com 2019 - 2024. All rights reserved.