指针数组如何工作?

T.T*_*.T. 6 c arrays pointers

char **Data[70]={NULL};  
Run Code Online (Sandbox Code Playgroud)

这个术语的正确用法是什么?怎么写呢?它在记忆中看起来像什么?我正在阅读许多关于指针的教程,但我没有在这种语法中看到它.任何帮助表示赞赏.谢谢.

Edd*_*die 24

这种结构

char **Data[70]={NULL};
Run Code Online (Sandbox Code Playgroud)

是指向char的指针的70个指针的数组.编译器70 * sizeof(char**)为此数组分配字节,假设32位指针为280字节.

如果你在内部将"指向char的指针"视为一个字符串,这不是真的但它足够接近,那么这是一个包含70个字符串指针的数组.制作一些ASCII艺术并假装你已经分配并填充了一些值....

 Array of        One or more
 char **           char *
+---------+     +---------+
|    0    | --> |   ptr   | -->  "Hello, world"
+---------+     +---------+
|    1    |
+---------+       +---------+
|    2    | ----> |  ptr2   | -->  "Goodbye, cruel world"
+---------+       +---------+
|    3    |
+---------+         +---------+
|    4    | ------> | ptr3[0] | -->  "Message 0"
+---------+         +---------+
    ...             | ptr3[1] | -->  "Message 1"
+---------+         +---------+
|   69    |         | ptr3[2] | -->  "Message 2"
+---------+         +---------+
Run Code Online (Sandbox Code Playgroud)

您可以使用这样的代码执行上述操作(错误检查跳过malloc返回值):

char **Data[70]={NULL};
char **ptr, **ptr2, **ptr3;

ptr = (char **) malloc(sizeof(char *));
*ptr = "Hello, world";
Data[0] = ptr;

ptr2 = (char **) malloc(sizeof(char *));
*ptr2 = "Goodbye, cruel world";
Data[2] = ptr2;

ptr3 = (char **) malloc(10 * sizeof(char *));
Data[4] = ptr3;

ptr3[0] = "Message 0";
ptr3[1] = "Message 1";
 ...
ptr3[9] = "Message 9"; 

printf("%s\n", *Data[0]);
printf("%s\n", Data[2][0]);
printf("%s\n", Data[4][0]);
printf("%s\n", Data[4][1]);
      ...
printf("%s\n", Data[4][9]);
Run Code Online (Sandbox Code Playgroud)

可以这样想:数组中的每个条目都是一个char **.每个条目可以指向存储器中的任意位置,所述位置是char *并且因此能够指向以空终止的字符数组(又称"字符串").

请仔细注意这与您分配2D数组时所获得的区别:

char *Data2[10][70]={NULL};
Run Code Online (Sandbox Code Playgroud)

Data2上面的分配给你一个二维char *指针数组,表示2-d数组被分配在一块内存中(10 * 70 * sizeof(char*)字节,或2800字节,32位指针).您无法将char **指针分配给内存中与一维char **指针数组相对应的任意位置.

另请注意(给出上面的声明DataData2)编译器将为以下数组引用生成不同的代码:

Data[0][0]
Data2[0][0]
Run Code Online (Sandbox Code Playgroud)

这是考虑这个问题的另一种方法:想象一下,你有几个指向字符串的指针数组:

char *table0[] = { "Tree", "Bench", "Stream" };
char *table1[] = { "Cow", "Dog", "Cat" };
char *table2[] = { "Banana", "Carrot", "Broccoli" };
char **Data[3];

Data[0] = table0;
Data[1] = table1;
Data[2] = table2;
Run Code Online (Sandbox Code Playgroud)

你有一个指向"char指针数组"的指针数组.如果你现在打印它的值data[1][1],可以这样想: data[1]得到一个指向数组的指针table1.然后价值table1[1]等于"Dog".