gpt4 book ai didi

c - 指向指针的指针数组如何工作?

转载 作者:太空狗 更新时间:2023-10-29 17:14:34 26 4
gpt4 key购买 nike

char **Data[70]={NULL};  

正确的术语是什么?不然怎么写?它在内存中是什么样子的?我正在阅读许多关于指针的教程,但我没有在这种语法中看到它。任何帮助表示赞赏。谢谢。

最佳答案

这个结构

char **Data[70]={NULL};

是一个包含 70 个指向 char 的指针的数组。编译器为此数组分配 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"
+---------+ +---------+

您可以使用如下代码执行上述操作(跳过错误检查 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]);

这样想:数组中的每个条目都是一个 char **。每个条目都可以指向内存中的任意位置,所述位置是 char *,因此能够指向一个以 null 结尾的字符数组,也就是“字符串”。

请仔细注意这与分配二维数组时得到的结果之间的区别:

char *Data2[10][70]={NULL};

上面 Data2 的分配给了你一个二维数组 char * 指针,说二维数组被分配在单个内存块中(10 * 70 * sizeof(char*) 字节,或 32 位指针的 2800 字节)。您无法将 char ** 指针分配给您使用 char ** 指针的一维数组所拥有的内存中的任意位置。

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

Data[0][0]
Data2[0][0]

这里有另一种思考方式:假设您有多个指向字符串的指针数组:

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;

你有一个指向“char 指针数组”的指针数组。如果您现在打印 data[1][1] 的值,可以这样想:data[1] 为您提供指向数组 table1 的指针。然后值 table1[1] 等于 "Dog"

关于c - 指向指针的指针数组如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1015944/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com