假设这样的代码片段最少:
#include <stdio.h>
int arr[3] = {1, 2, 3};
int *ptr = arr;
int main(void)
{
printf("The value of arr is %d, the address of the arr is %ptr", *ptr, ptr);
}
获取输出:
$ ./a.out
The value of arr is 1, the address of the arr is 0x107d57018tr
我想打印整个数组单元,因此尝试在printf函数中将%d
替换为%s
。
尽管如此,它仍然报告错误:
first_c_program.c:6:70: warning: format specifies type 'char *' but the argument has type 'int' [-Wformat]
printf("The value of arr is %s, the address of the arr is %ptr", *ptr, ptr);
~~ ^~~~
%d
1 warning generated.
如何打印整个数组单元。
答案 0 :(得分:1)
您必须分别打印每个值,如下所示:
for (size_t i = 0; i < 3; i++)
printf("%d", arr[i]);
printf("%d", *arr)
将数组的第一个值打印为整数。它等效于printf("%d", arr[0])
,就像printf("%d", arr[i])
和printf("%d", *(arr + i))
可以互换一样。 printf("%ptr", arr)
将数组的地址(即第一个值的地址)打印为地址。
正如其他人指出的那样,%s
期望char *
,请参阅printf(3)
。如果您有兴趣,printf
只是vfprintf
的包装器,它实现了一个跳转表,该跳转表又在一系列vtable和宏之后以write
的系统调用的形式结束,而格式化工作发生在vfprintf.c
中。您可以在this blog post和code for glibc中阅读详细信息。