char *s = "Hi";
printf("%s",s);
这里的s是一个指针,我将数据类型设置为“%s”,输出是“Hi”,字符串。
int a = 1;
int *p = &a;
printf("%i", p);
这里的p也是一个指针,我设置数据类型为“%i”,为什么输出不是“1”,整数?
在这两种情况下,如果我将数据类型设置为“%p”,它们都会给我变量的地址。但是如果我将数据类型设置为变量的数据类型,为什么它们不都给出变量存储的内容?
试试这个:
int a = 1;
int *p = &a;
printf("%p\n", p);
printf("%d\n", *p);
p
是pointer
,类型是int*
,打印应该用%p
,如果你想得到1
,是int
类型,你需要使用*p
来获取类型是的值int
。
当您将数据类型设置为
%s
时,printf
函数需要一个指向以 null 结尾的字符数组(即 C 风格字符串)的指针,并且它将打印 s 指向的字符,直到遇到空终止符 (' ')。因此,它正确地打印“Hi”,因为“Hi”是一个以 null 结尾的字符串。
当您将数据类型设置为
%i
时,您告诉 printf
需要一个整数,但您传递的是一个指向整数的指针,而不是直接传递一个整数。这将导致未定义的行为,因为 printf
将指针解释为整数,而不是取消引用它以获取 p
指向的值。输出不是“1”,因为它打印的是指针本身的值(地址)而不是它指向的整数的内容。如果您想获取 p
指向的值,您需要使用星号取消引用指针:
printf("%i", *p);
当您使用
%p
作为格式说明符时,printf
需要一个指针,并且它将正确打印所指向的变量的地址(s
和 a
)。