繁体   English   中英

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

[英]Pointer to constant behaves differently than pointer to non-constant when printing

我有以下代码:

int main(int argc, char **argv)
{
printf("%s\n",*argv);
int test = 5;
char* p;
*pint = test;
p = "banana";
printf("%s\n",p);
printf("%d\n",*pint);
}

为什么我必须写p="banana"而不是*p="banana"但是对于整数,它必须是*pint ,否则它将仅输出整数的地址? p不应该打印“香蕉”的地址吗?

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

  2. p = "banana";

您正在将字符串“ banana”的基地址分配给指针p。

而printf函数原型是

int printf( const char *restrict format, ... );

printf("%s\n",p);

上面的语句暗示您将指针p作为参数传递给函数printf,该函数包含字符串“ banana”的地址

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

如果使用%p打印,您将获得地址。

printf("%p\n",p);

C风格的字符串是由'\\0'终止的字符数组。 因此,当您给它分配一个字符串时,它就是这样。

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

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

执行此printf("%c", *p)将仅打印第一个字符。

如果执行此操作,请使用整数;

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

并打印出来;

print("%d", *p);

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

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

PS:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM