在C语言中,对于char *s = "Hi","printf("%s",s);"的输出是“Hi”,为什么int a = 1, int *p=&a,“printf("%i", p)”的输出不是1?

问题描述 投票:0回答:2
char *s = "Hi";
printf("%s",s);
这里的

s是一个指针,我将数据类型设置为“%s”,输出是“Hi”,字符串。

int a = 1;
int *p = &a;
printf("%i", p);

这里的p也是一个指针,我设置数据类型为“%i”,为什么输出不是“1”,整数?

在这两种情况下,如果我将数据类型设置为“%p”,它们都会给我变量的地址。但是如果我将数据类型设置为变量的数据类型,为什么它们不都给出变量存储的内容?

c pointers
2个回答
0
投票

试试这个:

int a = 1;
int *p = &a;
printf("%p\n", p);
printf("%d\n", *p);

p
pointer
,类型是
int*
,打印应该用
%p
,如果你想得到
1
,是
int
类型,你需要使用
*p
来获取类型是的值
int


0
投票

当您将数据类型设置为

%s
时,
printf
函数需要一个指向以 null 结尾的字符数组(即 C 风格字符串)的指针,并且它将打印 s 指向的字符,直到遇到空终止符 (' ')。因此,它正确地打印“Hi”,因为“Hi”是一个以 null 结尾的字符串。

当您将数据类型设置为

%i
时,您告诉
printf
需要一个整数,但您传递的是一个指向整数的指针,而不是直接传递一个整数。这将导致未定义的行为,因为
printf
将指针解释为整数,而不是取消引用它以获取
p
指向的值。输出不是“1”,因为它打印的是指针本身的值(地址)而不是它指向的整数的内容。如果您想获取
p
指向的值,您需要使用星号取消引用指针:

printf("%i", *p);

当您使用

%p
作为格式说明符时,
printf
需要一个指针,并且它将正确打印所指向的变量的地址(
s
a
)。

© www.soinside.com 2019 - 2024. All rights reserved.