在以下代码中,我们将指针传递给字符串,它可以正常工作,但不适用于整数指针。我想知道为什么吗?
#include <stdio.h>
int main(){
char *astring = "afdv";
printf("%s",astring);
int a;
a = 1000;
int *ptr = &a;
printf("\n%d", ptr);
}
答案 0 :(得分:1)
在第一个printf
中,您没有发送指针。您取消了对指针的引用,因此实际上是在发送一个字符。同样,如果要打印整数,请发送*ptr
,即整数指针的解引用值。
我想你的困惑的根源就是这个-
printf("%s", string_ptr);
完全打印字符串值,而不是指针值,但是
printf("%d", integer_ptr);
打印指针值,而不是整数值。
这是因为实现printf
的方式。当在格式字符串中看到%s
时,它将相应的参数视为指向以NULL结尾的字符串的指针。然后在指针中包含的地址处查找该字符串的值。
但是当看到%d
时,它将相应的参数视为整数值并直接打印出来。
行为上的变化是因为整数,浮点数之类的类型较小且大小有限,可以直接将其作为值传递给printf
。但是字符串的大小可以任意大。因此,将其作为指针传递并让printf
使用指针查找实际值是很有意义的。
答案 1 :(得分:0)
因为语言规范如此规定。
%s
转换说明符期望其对应的参数具有类型char *
; printf
然后将打印出从该地址开始的字符序列,直到看到字符串终止符为止。
%d
转换说明符期望其对应的参数具有类型int
; printf
然后将输出该值的文本表示形式为带符号的十进制整数。
查看您方便的C参考手册,获取转换说明符的完整列表以及所需的参数类型。如果您没有方便使用的C参考手册,那么自1980年代后期以来,我更喜欢使用C: A Reference Manual,尽管当前版本仅涵盖C99。
如果您使用%d
并传递不是整数,则行为是 undefined 。编译器不必为您传递错误类型的参数而大吼大叫。如果您运行代码,则可能会发生任何事情。在实践中,通常会出现乱码输出。如果传递的内容不是%s
的指针,则可能会出现运行时错误。