C语言printf打印字符串为何无需使用解引用运算符*?
问题解析:
printf("%s", one)为何无需解引用运算符 示例代码
#include<stdio.h> char*display(); int main() { char*one=NULL; one=display(); one[3]='9'; printf("%s",one);//疑问(为何不使用解引用运算符) } char*display(){ static char a[30]="hello"; return a; }
核心原因
这是由printf中%s格式符的参数规则直接决定的:
%s的作用是打印字符串,它要求传入的参数必须是指向字符串首字符的char*类型指针。变量one本身就是指向静态数组a首字符的指针,完全符合%s的参数要求,所以直接传入即可。- 要是用
*one,得到的是指针指向的第一个字符(这里是'h'),此时printf会把这个字符的ASCII值当作内存地址来解析,这属于未定义行为,大概率会导致程序崩溃或输出乱码。 - 额外补充:C语言里数组名在多数场景下会自动转换成指向首元素的指针,
display函数返回的a就是这种转换后的结果,所以one拿到的是字符串首字符的地址,printf会从这个地址开始遍历内存,直到遇到字符串结束符\0才停止打印。
内容的提问来源于stack exchange,提问作者Bharath R
相关产品推荐
相关产品推荐

