【问题标题】:Is name of a string a char pointer? [duplicate]字符串的名称是字符指针吗? [复制]
【发布时间】:2014-02-14 09:37:07
【问题描述】:
char str[100];
char *q;

qstr 有什么区别....不是都char*
请注意,我说的是str,而不是str[100]

【问题讨论】:

  • 尝试编译str++;,你会发现一个重要的区别。
  • sizeof(str) =100bytes

标签: c pointers char


【解决方案1】:
char str[100];

str 是数组对象的名称。它不是真正意义上的指针。

但与任何数组类型的表达式一样,在大多数情况下,它会隐式转换为数组第一个元素的地址(或等效的指针)。这种隐式转换产生一个指针;没有指针object,所以没有什么可以修改的。 (结果指针值的类型为char*,而不是const char*char *const。)

此处适用的例外情况是 str 是一元 &sizeof 运算符的操作数。

char *q;

q 是指针对象的名称,与几乎所有非const 对象一样,它可以被修改。

请参阅comp.lang.c FAQ 的第 6 节。

【讨论】:

    【解决方案2】:

    q 是一个未初始化的指针,而str 指向某处分配了 100 个字节。

    另外,您可以更改q 指向的位置。但是以后不能更改str的地址。

    【讨论】:

    • 为什么我们可以更改q 而不能更改str
    • 因为它是如何工作的。 q 是一个可以更改的指针。 str 是一个不能改变大小的数组,但它的内容可以。
    • str 不是指针。
    【解决方案3】:

    它们不一样。

    StackOverflow 上已经存在大量数组与指针问题。请参阅thisthisthis

    【讨论】:

      【解决方案4】:

      按照惯例,数组的名称是一个常量,它的值是它的第一个元素的地址。

      在大多数情况下,当str 用于表达式或语句时,它会隐式转换为数组第一个元素的地址。 sizeof 运算符是一个例外。在这种情况下 (sizeof(str)),str 是数组本身,它不会被转换为地址,这就是为什么 sizeof(str) 结果为 100

      【讨论】:

      • 然后解释sizeof str的结果。不,str 可能被隐式转换到的指针值不是const
      • 至少是char *const,即指向非常量char的常量指针。你所拥有的是一个指向常量字符的非常量指针。
      • @sh1ftst0rm:不,只是char*str 的声明不会创建指针对象,因此不需要 const 以避免修改任何指针对象。同样,2+2 的值属于int,而不是const int
      • @KeithThompson 现在清楚了吗?
      • 清除,但不正确。没有const,并且数组名称不会总是 转换为指针值。想想你的答案对sizeof str 的结果意味着什么。
      【解决方案5】:

      就访问字符串中的数据而言,是的,str 可以被认为是char*,或者更准确地说是char *const,因为您不能为str 分配不同的地址。

      严格来说,它们是不同的类型,这就是为什么不能为str 分配新值的原因。把它想象成编译器:每个变量只是一个特定地址的标签,它将为你分配。 str,代表一个由100个chars组成的缓冲区的起始地址,但q是一个地址的地址,而后者又是一个char的地址。

      您可以更改变量的 ,但不能更改(在运行时)放置变量的位置(即其地址)。

      【讨论】:

      • 你的意思是char* const
      • 为什么str 是常量,而q 不是
      • @sh1ftst0rm 我认为您的评论有误(但答案正确):const char*char const* 意思相同,与 char *const 不同
      • @rullof:不,标准没有这么说。
      • @learner:很高兴这对您有所帮助,但您也应该看到 Keith Thompson 的回答。它更精确。
      【解决方案6】:

      在该示例中,str 是 char[100] 类型,而 q 是指向 char 的指针。它可以指向 char 类型的任何单个数组元素,但不能指向 char 类型的数组。

      【讨论】:

      • q 不能指向 char 的数组。它可以指向char数组的一个元素;然后,您可以使用指针算法来访问数组的其他元素。
      猜你喜欢
      • 2011-11-01
      • 2010-09-27
      • 1970-01-01
      • 1970-01-01
      • 2015-01-17
      • 1970-01-01
      • 2020-11-04
      • 1970-01-01
      • 2013-12-07
      相关资源
      最近更新 更多