我们可以在printf中传递指针吗?

时间:2018-08-21 18:00:56

标签: c pointers printf

在以下代码中,我们将指针传递给字符串,它可以正常工作,但不适用于整数指针。我想知道为什么吗?

#include <stdio.h>
int main(){
    char *astring = "afdv";
     printf("%s",astring);
    int a;
    a = 1000;
    int *ptr = &a;
    printf("\n%d", ptr);
}

2 个答案:

答案 0 :(得分:1)

在第一个printf中,您没有发送指针。您取消了对指针的引用,因此实际上是在发送一个字符。同样,如果要打印整数,请发送*ptr,即整数指针的解引用值。

我想你的困惑的根源就是这个-

 printf("%s", string_ptr);

完全打印字符串值,而不是指针值,但是

printf("%d", integer_ptr);

打印指针值,而不是整数值

这是因为实现printf的方式。当在格式字符串中看到%s时,它将相应的参数视为指向以NULL结尾的字符串的指针。然后在指针中包含的地址处查找该字符串的值。

但是当看到%d时,它将相应的参数视为整数值并直接打印出来。

行为上的变化是因为整数,浮点数之类的类型较小且大小有限,可以直接将其作为值传递给printf。但是字符串的大小可以任意大。因此,将其作为指针传递并让printf使用指针查找实际值是很有意义的。

答案 1 :(得分:0)

因为语言规范如此规定。

%s转换说明符期望其对应的参数具有类型char *printf然后将打印出从该地址开始的字符序列,直到看到字符串终止符为止。

%d转换说明符期望其对应的参数具有类型intprintf然后将输出该值的文本表示形式为带符号的十进制整数。

查看您方便的C参考手册,获取转换说明符的完整列表以及所需的参数类型。如果您没有方便使用的C参考手册,那么自1980年代后期以来,我更喜欢使用C: A Reference Manual,尽管当前版本仅涵盖C99。

如果您使用%d并传递不是整数,则行为是 undefined 。编译器不必为您传递错误类型的参数而大吼大叫。如果您运行代码,则可能会发生任何事情。在实践中,通常会出现乱码输出。如果传递的内容不是%s的指针,则可能会出现运行时错误。