【问题标题】:Can we pass pointers in printf?我们可以在 printf 中传递指针吗?
【发布时间】:2018-08-21 18:00:56
【问题描述】:

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

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

【问题讨论】:

  • 不,您传递一个 single char 值(然后将其转换为 int)。如果您的意思是在打印字符串时传递一个指针,那么这是非常不同的,因为printf 知道如何使用"%s" 格式处理这些指针。
  • 请演示您在何处传递指向字符串的指针。你甚至没有传递一个 string... 也可以试试printf( "%p\n", ptr )。然后阅读printf()上的手册。
  • 在第一种情况下,"%c" 需要单个字符,然后您将其传递给取消引用的字符指针 (*astring),它是单个字符。正如您所说,它不是“指向字符串的指针”,而是&astring。一切都很好。 "%d" 需要一个整数值,而不是指针。如果你取消引用它(*ptr),那么它会起作用。
  • 不要只是疯狂的实验。仔细阅读文档,看看哪些值必须与特定占位符配对。

标签: c pointers printf


【解决方案1】:

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

我猜你的困惑的根源是这个-

 printf("%s", string_ptr);

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

printf("%d", integer_ptr);

打印指针值而不是整数值

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

但是当它看到一个%d时,它把对应的参数当作一个整数值,直接打印出来。

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

【讨论】:

  • 是的,你是对的..这正是我想问的..我之前在这里放错了代码。
【解决方案2】:

因为语言规范是这么说的。

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

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

查看方便的 C 参考手册以获取转换说明符的完整列表以及它们期望的参数类型。如果您没有方便的 C 参考手册,我的首选是自 1980 年代后期以来的 C: A Reference Manual,尽管当前版本仅涵盖 C99。

如果您使用%d 并传递不是整数的东西,那么行为是未定义。编译器不需要因为传递错误类型的参数而对您大喊大叫。如果你运行代码,任何事情都可能发生。在实践中,您通常会得到乱码输出。如果您传递的不是%s 的指针,您可能会收到运行时错误。

【讨论】:

    猜你喜欢
    • 2019-09-08
    • 2011-06-12
    • 1970-01-01
    • 2019-02-06
    • 1970-01-01
    • 2020-08-15
    • 1970-01-01
    • 2011-04-05
    • 2011-10-11
    相关资源
    最近更新 更多