解释双星号从数组返回值(在 C 中)

explaination double asterisk returned value from array (in C)

我有一个数组:

char *p[2][3] = {"abc","defg","gi","jklmno","pqrstuvw","xyz"};

当我打印以下语法时,编译器打印出奇怪的值,我不明白为什么:

printf("%c", **p); // Print 'j'
printf("%c", *p[1]); // Print 'v'

谢谢。

基本上你所做的创建了一个二维字符串数组,它给你:

*p[0] = {"abc","defg","gi"};
*p[1] = {"jklmno","pqrstuvw","xyz"};

**p 将指向 *p[0] 中的第一个单词的地址,即 "abc",除非你调用 printf("%c", **p) 它实际上会尝试将 "abc" 的内存地址显示为字符,因此是随机结果。例如 运行 你的代码我得到 @ 和 L。但是如果你这样做:

printf("%d\n", **p);
printf("%d\n", *p[1]);

printf 调用将显示指针值,它们是 "abc" 和 "jklmno" 的地址。现在,如果您这样做:

printf("%s\n", **p);
printf("%s\n", *p[1]);

你会看到 "abc" 和 "jklmno" 显示,因为 printf 会理解它应该从 **p 和 *p[1] 指向的内存地址读取一个字符串。另外我忘了提到 **p 与 *p[0] 相同。如果你想显示第一个数组中第一个字符串的第一个字符,你应该调用:

printf("%c\n", ***p); // ***p is the same as p[0][0][0]

希望对您有所帮助。

数组的初始化不正确。由于您正在尝试创建二维数组,因此缺少一些大括号:

char *p[2][3] = {{"abc","defg","gi"},{"jklmno","pqrstuvw","xyz"}};

必须使用说明符 s 来打印数组:

printf("%s", **p); //abc
printf("%s", *p[1]); //jklmno

您不应直接使用取消引用运算符。始终使用数组下标运算符:

printf("%s", p[0][0]); //abc
printf("%s", p[1][0]); //jklmno