char []的奇怪行为

时间:2017-06-21 15:25:08

标签: c++ char

char a[5] = "hill";

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

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

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

1 个答案:

答案 0 :(得分:0)

  

我很困惑......究竟是什么?它被称为char *

类型

如果您像以下一样定义数组:@Override public void onClick(View v) { Intent intent = new Intent(v.getContext(),CategorySelector.class); intent.putExtra("sorting_category_name",names.get(v.getId())); startActivity(intent); } 。 以下是:

<nav class='navbar navbar-inverse navbar-toggleable-sm mx-auto sticky-top'>
    <button class="navbar-toggler collapsed mx-auto" type="button" data-toggle="collapse" data-target="#navbarNav" aria-expanded="false" aria-controls="navbarNav" aria-label="Toggle navigation">
    <span class="navbar-toggler-icon"></span>
    <span class="icon-bar"></span>
    <span class="icon-bar"></span>
    <span class="icon-bar"></span>
  </button>
      <div class="collapse navbar-collapse" id="navbarNav">
    <ul class='navbar-nav mx-auto'>
      <li class='nav-item'><a href='#sobreMim' class='nav-link'><strong>Diego Mengue</strong></a></li>
      <li class='nav-item'><a href='#portfolio' class='nav-link'>Portfólio</a></li>
      <li class='nav-item'><a href='#contato' class='nav-link'>Contato</a></li>
    </ul>
    </div>
  </nav>

所有这些都指向相同的内存地址,但它们的类型不同。请注意,在案例1中,数组名称将为decayed

  

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

这意味着如果您打印出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 的地址,它将是相同的。另请记住,如果您要打印地址,则将指针投射到a而不仅仅是&a

  

它是一个指针,它的值必须是第一个字符的地址。一个人必须有一个地址。当然这两个地址必须不同,因为它是char *类型,它所持有的地址指向char。

假设void*隐含地指向第一个元素,你是对的。此变量还有一个地址,其中存储了指向某个东西的值。

编辑#1:

上述证据:

有几条评论受到质疑,我在intaa解释的内容就是证据。因此,我写了一点不编译C代码:

&a[0]

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

&a

<强>的sizeof():

以下是不同的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;
       ^