#include<stdio.h>
void main()
{
char ***p="hello";
printf("%c",++*p++);
}
我不明白为什么(*)间接运算符在这里使用了三次。
当我编译该程序时,输出为“j”。 但实际上听到p是指向指向Array字符的指针的指针。 那么为什么我得到输出为j。 我不明白这背后的逻辑是什么。 请帮助我理解这背后的实际逻辑。
当我只使用一个间接运算符并且编译程序时,混乱会增加。然后输出为i .means
void main()
{
char *p="hello";
printf("%c",++*p++);
}
答案 0 :(得分:2)
代码没有有意义的输出作为C代码。代码无效。
首先,void main
不是C中main
函数的有效声明。main
必须声明为返回int
。
其次,char ***p="hello"
初始化无效。字符串文字衰减为C中的类型char *
。类型char *
的值不能用于初始化char ***
类型的对象。
第三,取消引用char ***
指针会产生类型为char **
的指针值,该值不能printf
- 带有%c
格式说明符。
答案 1 :(得分:1)
首先,这是一种未定义的行为。
其次,它也不是正确的C(或C ++)代码。由于非const char指针,它会生成此警告。
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;
}
关于打印的内容:程序已请求运行时以不寻常的方式终止它。但这是一种未定义的行为 - 您的结果可能会有所不同。
答案 2 :(得分:1)
你不理解为什么使用多个间接的原因是因为多个间接在这里没有意义;这只是这段代码中的众多问题之一。
"hello"
是字符串文字,它也是一个数组表达式,特别是“char
的6元素数组”,在此上下文中将其转换(“衰减”)为指向{{ 1}}; char
应声明为
p
表达式char *p = "hello";
尝试将事件++*p++
增加到(在本例中为字符p
),并且副作用会使h
指向下一个角色。修改字符串文字的行为是 undefined ;根据平台,字符串文字可能不可写,表达式p
可能导致访问冲突。
以下是上述程序的更正版本,它给出了预期的结果:
++*p++
不是让#include <stdio.h>
int main(void)
{
char h[] = "hello";
char *p = h;
printf("%c\n", ++*p++);
return 0;
}
指向字符串文字,而是指向一个用字符串文字的内容初始化的本地缓冲区。