【问题标题】:Weird behaviour of char[] [duplicate]char []的奇怪行为[重复]
【发布时间】:2017-06-21 15:25:07
【问题描述】:
char a[5] = "hill";

我很困惑...... a 实际上是什么?据说它是 char* 类型。它是一个指针,它的值必须是第一个字符的地址。 a 本身必须有一个地址。当然,这两个地址必须不同,因为 a 的类型是 char* 并且它持有的地址指向 char

std::cout << (int)&a << ' ' << (int)a << std::endl;

哦,好吧,打印出完全相同的地址。请解释一下,这里发生了什么

【问题讨论】:

  • a 是一个数组,而不是一个指针。由于称为数组衰减,它可以用作指向第一个元素的指针。这已经回答了无数次了......
  • 这是链接:What is array decaying?
  • a 包含一个数字(使用 std::cout 打印出来时看起来像)。数字如何成为数组?对我来说似乎是一个地址,仅此而已
  • 请阅读链接。 (int)a 使 aint [5] 衰减到 int *(指向第一个元素的指针),然后转换为 int。
  • @user3600124 您的 cmets 清楚地表明您没有阅读提供的链接。 a 在预期指针的位置使用时,通常会衰减为指针。在那些情况中,它将表现为一个指针。在其他所有情况下,它都是一个数组。您的 cout 语句是将其视为指针的情况之一。

标签: c++ char


【解决方案1】:

我很困惑... a 到底是什么?据说是char*类型的

如果您像这样定义数组:char a[5] = "hill;"。 那么以下成立:

1. a     implicitly decayed to char *: decayed to a pointer to the first element
2. &a[0] is of type char *:            pointer to the first element
3. &a    is of type char (*)[5]:       pointer to an array which starts at the first element

它们都指向相同的内存地址,但它们属于不同的类型。请注意,在情况 1 中,数组名称将为 decayed

哦,好吧,打印出完全相同的地址。请解释一下,这里发生了什么

这意味着如果您打印出a&amp;a 的地址,它将是相同的。另请记住,如果您想打印地址,请将指针转换为 void* 而不仅仅是 int

它是一个指针,它的值必须是第一个字符的地址。并且 a 本身必须有一个地址。当然,这两个地址必须不同,因为 a 是 char* 类型,并且它保存的地址指向 char。

假设a 隐含地指向第一个元素,你是对的。此外,这个变量还有一个地址,指向某物的值存储在该地址中。


编辑#1:

以上证明:

因为几个 cmets 受到挑战,我对 a&amp;a[0]&amp;a 的解释就是证明。因此我写了这个不编译的 C 代码:

int main()
{
    char a[5];
    double b;

    /* the following fails */
    b = a;     /* decay to char * */
    b = &a[0]; /* char *          */
    b = &a;    /* char (*)[5]     */
}

编译器将失败并输出错误和预期的类型。

../src/SO_Test_C.c:6:7: error: incompatible types when assigning to type ‘double’ from type ‘char *’
     b = a;
       ^
../src/SO_Test_C.c:7:7: error: incompatible types when assigning to type ‘double’ from type ‘char *’
     b = &a[0];
       ^
../src/SO_Test_C.c:8:7: error: incompatible types when assigning to type ‘double’ from type ‘char (*)[5]’
     b = &a;
       ^

sizeof():

这是不同的 sizeof() 操作返回的内容:

sizeof(a)     --> Array size:   5
sizeof(&a[0]) --> Pointer size: 8 (64bit) / 4 (32bit)
sizeof(&a))   --> Pointer size: 8 (64bit) / 4 (32bit)

【讨论】:

  • 1 不正确。
  • @Slava:谢谢,我更正了!
  • sizeof(&a) 给出 4。如果 &a 是 char (*)[5] 类型,它不应该给出 4,不是吗?
  • @user3600124:我扩展了我的答案......不要忘记它是指向数组的指针,注意(*),因此大小将是您系统上的指针大小 4。
猜你喜欢
  • 1970-01-01
  • 2017-04-08
  • 1970-01-01
  • 1970-01-01
  • 2012-10-20
  • 1970-01-01
  • 2012-06-01
  • 2017-03-13
  • 1970-01-01
相关资源
最近更新 更多