如下程序: char *a="张三”; printf("%s\n",a); 1、为什么“张三"可以直接赋值

如下程序:
char *a="张三”;
printf("%s\n",a);
1、为什么“张三"可以直接赋值给指针变量a?
2、程序第二行为什么输出列表中是a,而打印出来的却是 张三 而不是张三存储的地址?
3、如果把程序第二行的输出列表中改为 *a 运行时就会出错?
求大神帮忙解答一下疑惑😘😘(。・ω・。)ノ♡

1、你可以将"张三"视为char []类型的数据,char []类型自然可以赋值给char *类型,因为都是表示首字符的地址。

2、因为你已经写明了——变量a的类型是%s,那么,程序就会将a视为字符串首字符的地址,打印出整个字符串。如果你改成printf("%d\n",a);那么打印出来的就是张三的存储地址。

3、%s会将对应的变量视为一个字符串首字符的地址,打印出整个字符串。如果你改成*a,那么实际%s收到的是张三的数据,而不是张三的地址,当%s吧张三的数据当做地址去操作时,当然会出现错误。

追问

第3个问题的追问:
在程序第一行,令指针变量指向了"张三",即*a中存放了"张三"的地址;
要想通过指针变量间接的输出它所指向的变量,则应该在printf函数的输出列表中打"*a"吗?如果直接打"a"的话会输出这个指针变量所指向的变量的地址。对吧!
那么在上述程序中第二行,我要输出a这个指针变量所指向的变量,不应该是在输出列表中为"*a"吗?

温馨提示:答案为网友推荐,仅供参考
相似回答