指针或内存地址可以作为 printf() 函数中的参数吗?

Are pointers or memory addresses can be parameters in printf() function?

我在制作打印功能时感到困惑。

void Printing(int* pi, char* pa)
{
    printf("%d", *pi);
    printf("%s", *pa);
}

上面的代码在第 2 个 printf() 中有错误。 但是下面的代码没有。它可以很好地打印整数和字符串。

void Printing(int* pi, char* pa)
{
    printf("%d", *pi);
    printf("%s", pa);
}

至此,我给printf()赋了变量。但是我不明白为什么我需要将指针指向第二个 printf().

在你的代码中

 printf("%s", *pa);

应该是

 printf("%s", pa);

as %s 期望空字符数组的起始地址(即指针,而不是您提供的 char)。

来自 C11,章节 7.21.6.1 fprintf

s If no l length modifier is present, the argument shall be a pointer to the initial element of an array of character type. Characters from the array are written up to (but not including) the terminating null character. [...]

补充一下,*papa[0]一样,都是char类型。要打印它,您需要使用 %c 转换说明符。

But I don't understand why I need to give the pointer to the 2nd printf().

因为字符串在 C 中有点奇怪。从技术上讲,C 中没有字符串类型。所以 const char */char * 用于字符串。它的工作方式是指针指向字符串的开头,字符串以 NUL 字符 '[=13=]' 结尾。为了形象化它,假设您使用 Printing(0, "Hello"); 调用 Printing,您传递一个指向字符串文字开头的指针,它在内存中看起来像这样:

+---+---+---+---+---+---+
| H | e | l | l | o |END|
+---+---+---+---+---+---+

你传递的指针指向第一个字符,H。如果你明白这一点,你就会明白为什么它需要一个指针。如果取消引用它,您将只给出第一个字符 H,因此它无法打印整个字符串。