printf数组的整个单元

时间:2018-10-19 03:01:48

标签: c

假设这样的代码片段最少:

#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.

如何打印整个数组单元。

1 个答案:

答案 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 postcode for glibc中阅读详细信息。