【问题标题】:Pointer to constant behaves differently than pointer to non-constant when printing打印时指向常量的指针与指向非常量的指针的行为不同
【发布时间】:2017-03-07 02:21:24
【问题描述】:

我有以下代码:

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不应该打印“香蕉”的地址吗?

【问题讨论】:

  • 当您说p="banana" 时,期望在p 中存储什么?
  • char* p = (char*)malloc(sizeof(char)); 然后p = "banana";....表示需要清理基础知识.... :)
  • 您不必“必须”这样做。你选择这样做。 *x = 表示更新存储在x 指向的空间中的值。 x = 的意思是让x 指向别的东西。 p = "banana" 泄漏内存并使p 指向"banana" 已经存在的位置。改写到p指向的空间会很好:*p = 'b';
  • %s 格式说明符需要 pointer 参数。 %d 格式说明符需要 value 参数。与常量无关。
  • 目前代码无法编译,因为pint没有定义。

标签: c++ c pointers char


【解决方案1】:

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 的 cmets 编辑了我的答案!

【讨论】:

  • 这个答案大部分是正确的,但在细节上有一些误导性问题:char* 不一定指向一个以空值结尾的字符串,尽管它是最常用的。您将 p 用作数组有点令人困惑,因为它与 OP 作为指针的使用相冲突。整数数组可以在技术上也可以为空终止。但是,不能将 0 用作有效值是一个严重的缺陷,因此这并不常见。
  • "C 风格字符串char * ..." C 字符串不是char*,它不是指向@987654332 的指针@。 C 字符串是char 的数组,其中至少有一个元素等于'\0'
  • 我使用p 作为一个数组来向他展示char *p 如何在内部处理"banana"。您可以使用空终止字符来终止整数数组,但如果您打印出数组的所有元素,它将打印出空终止字符,这将产生意想不到的结果并且在整数数组中没有用。但是对于char 的数组,它可以作为打印出元素的结尾并且很有用。我明白你的意思。
  • 当然,我理解你的意图。但是,这个“char * is an array of characters”是完全错误的,因此 not 应该是其他正确答案的一部分.
【解决方案2】:
  1. 您正在比较数组和整数变量的行为!

  2. p = "banana";

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

而printf函数原型是

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

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

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

【讨论】:

  • ... C 字符串的“基地址”是 C 字符串的第一个 char 的地址。
【解决方案3】:

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

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

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

【讨论】:

    猜你喜欢
    • 2014-02-23
    • 2020-10-23
    • 2011-08-04
    • 2020-03-25
    • 1970-01-01
    • 2013-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多