打印时,指向常量的指针与指向非常量的指针的行为不同

Pointer to constant behaves differently than pointer to non-constant when printing

本文关键字:常量 指针 打印 非常      更新时间:2023-10-16

我有以下代码:

int main(int argc, char **argv)
{
printf("%sn",*argv);
int test = 5;
char* p;
*pint = test;
p = "banana";
printf("%sn",p);
printf("%dn",*pint);
}

为什么我必须写p="banana"而不是*p="banana",但是对于一个整数,它需要是*pint,否则它只会打印整数的地址?p不打印"banana"的地址吗?

  1. 你正在比较数组和整数变量的行为!

  2. p = "banana";

你正在将字符串"banana"的基址赋值给指针p。

printf函数原型为

int printf( const char *restrict format, ... );
printf("%sn",p);

上面的语句意味着你将指针p作为参数传递给函数printf,该函数保存字符串"banana"的地址

您正在使用%s打印。这将打印一个C字符串,以输入作为该字符串的第一个字节的地址。

如果你用%p打印它,你将得到地址。

printf("%pn",p);

c风格字符串是以''结尾的字符数组。当你给它赋值一个字符串时,它看起来是这样的;

char p[] = {'b', 'a', 'n', 'a', 'n', 'a', ''};

因此,当您使用格式说明符%s打印p时,它将继续打印剩余的字符,直到到达null终止字符。

这样做printf("%c", *p)将只打印第一个字符。

使用整数,如果这样做;

int p[] = {1,2,3,4,5};

并打印出来;

print("%d", *p);

你只得到数组中的第一个整数。

注意;每个格式说明符都有自己接受的值类型。这就是为什么它们被称为格式说明符

PS:

我已经根据user2079303和talk的评论编辑了我的答案!