0
#include<stdio.h>
void main()
{
 char ***p="hello";
 printf("%c",++*p++);
}

我不明白为什么 (*) 间接运算符在这里使用了 3 次。

当我编译这个程序时,输出是 "j"。但实际上听说p是指向字符数组的指针的指针。那为什么我得到输出为j。我不明白这背后的逻辑是什么。请帮助我理解这背后的实际逻辑。

当我只使用一个间接运算符并编译程序时,混乱会增加更多。然后输出是 i .means

void main()
{
 char *p="hello";
 printf("%c",++*p++);
}
4

3 回答 3

2

该代码没有有意义的 C 代码输出。该代码根本无效。

首先,void main不是mainC 中函数的有效声明。main必须声明为返回int

其次,char ***p="hello"初始化无效。字符串字面量char *在 C 中衰减为具有类型。 type 的值char *不能用于初始化 type 的对象char ***

第三,取消引用char ***指针会产生一个 type 的指针值char **,它不能用格式说明符printf-ed 。%c

于 2012-07-23T18:49:38.613 回答
1

首先,这是一种未定义的行为。

其次,它也不是正确的 C(或 C++)代码。由于非常量字符指针,它会生成此警告。

3.c: In function 'main':
3.c:5:12: warning: initialization from incompatible pointer type [enabled by default]
  char ***p="hello";
            ^

最好这样做:

#include <stdio.h>

int main()
{
    const char ***p="hello";
    printf("%c",++*p++);

    return 0;
}

关于它打印的内容:程序已请求运行时以不寻常的方式终止它。但这是一种未定义的行为 - 您的结果可能会有所不同。

于 2012-07-23T17:05:34.490 回答
1

您不明白为什么使用多重间接的原因是因为多重间接在这里没有意义;这只是这段代码中的众多问题之一。

"hello"是字符串字面量,它也是一个数组表达式,特别是“6 元素数组char”,在这种情况下被转换(“衰减”)为指向char; p 声明为

char *p = "hello";

该表达式++*p++尝试增加事物p指向的值(在本例中为字符h),并作为副作用前进p以指向下一个字符。修改字符串文字的行为是未定义的;根据平台的不同,字符串文字可能不可写,并且表达式++*p++可能会导致访问冲突。

以下是上述程序的更正版本,它给出了预期的结果:

#include <stdio.h>

int main(void)
{
  char h[] = "hello";
  char *p = h;
  printf("%c\n", ++*p++);
  return 0;
}

我们没有指向字符串文字,而是p让它指向一个本地缓冲区,该缓冲区已使用字符串文字的内容进行了初始化。

于 2012-07-23T18:27:13.827 回答