指针或内存地址可以作为 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. [...]
补充一下,*pa
和pa[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
,因此它无法打印整个字符串。
我在制作打印功能时感到困惑。
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 nol
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. [...]
补充一下,*pa
和pa[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
,因此它无法打印整个字符串。