为什么[]和* a表现不同?

时间:2017-01-05 11:46:05

标签: c++ arrays oop pointers

我认为a[]*a是相同的,因为它们像指针一样工作。但是我在下面的代码中遇到了一些意外的事情:

#include <iostream>
using namespace std;

class F {
public:
    bool a[];
    F();
};

F::F() {
    *a = new bool[5];
    a[2] = true;
}

int main() {
    F obj;
    if(obj.a[2])
        cout << '?';
    return 0;
}

此代码打印?,但我不明白它是如何工作的。当:

*a = new bool[5];

更改为:

a = new bool[5];

编译器报告:

F:\main.cpp|11|error: incompatible types in assignment of 'bool*' to 'bool [0]'|

我发现这种行为很奇怪,所以我正在玩这个代码。当我将a的类型从bool更改为int时,编译器始终报告错误

F:\main.cpp|11|error: invalid conversion from 'int*' to 'int' [-fpermissive]|

为什么这样做会有效?

3 个答案:

答案 0 :(得分:2)

该行:

*a = new bool[5];

相当于:

a[0] = new bool[5];

您没有初始化数组,而是分配一个bool数组,然后将其隐式转换为bool以分配给a[0]:值应为true因为new返回的指针应该与0不同。此隐式转换不适用于int:这就是更改a类型时出错的原因。

现在,考虑这一行:

a = new bool[5];

在这里,您尝试将动态分配的数组分配给a,换句话说,将指向数组bool*的指针分配给静态数组bool[0]:正如编译器所说,类型不兼容。静态数组a[]可以用作指针,例如在以下代码中:

int foo(bool* a) { /* ... */ }

bool my_array[5];
foo(my_array);

但是指针不能像你想要的那样转换成静态数组。

答案 1 :(得分:2)

  

我认为a[]*a是相同的,因为它们像指针一样工作。

让我们谈谈这一宣言:

int a[4] = { 1, 2, 3, 5 };
int *b = NULL;

这是他们如何在可执行文件中登陆内存:

   +----+----+----+----+
a: |  1 |  2 |  3 |  5 |        <-- 4 integers
   +----+----+----+----+

   +----------+
b: |   NULL   |                   <-- 1 pointer that points to nowhere
   +----------+

如您所见,他们不是相同的事情。

b = new int[4];之后会发生什么?

b的新内存布局是这样的:

   +----------+
b: | 0xacf3de |               <-- 1 pointer that points to a block of 4 integers
   +----------+

Somewhere else in memory (at address 0xacf3de)...

          +----+----+----+----+
0xacf3de: |  ? |  ? |  ? |  ? |         <-- 4 integers
          +----+----+----+----+

但是等等,有人告诉我,数组就像指针一样工作......

不,那不是真的。这些数组不像指针那样工作。

数组名称(a,f.e。)可以用作其在内存中的地址的快捷方式(实际上,它是其第一个元素的地址)。以下符号是等效的:

a
&a
&a[0]

所有这些值都是内存中的地址,其中存储了a的第一个元素(上例中的1)。

a[0]int&a[0]int *。这是完整的表格。另外两个是语言提供的快捷方式,以便使代码更易于阅读和理解。

指针的内容不同。

b是存储在上面示例中的b变量(NULL0xacf3de)中的值。它是int *类型的值 - 存储int的内存中的地址。&b是内存中存储({1}}值({1}}的地址。其类型为b - 指针指向int **的指针;或者&#34;内存中的地址,其中存储了int&#34;的地址。

但等等,在某些情况下可以将它们替换为另一种

到目前为止,是的,指针和数组是可以互换的。如您所见,有一个常见的数据类型:int。它的类型为int *(存储b的地址)以及int的类型(也是&a[0]的地址)。

这意味着可以使用int的地方,可以使用b(简称a),反之亦然。

此外,如果可以使用&a[0],则可以使用*b。它是*a的缩写,它表示*&a[0]&#34;的地址(*)中存储的值{&)事实上,它与a[0]相同。

但是,在可以使用a[0]的地方,&b 不能代替;请记住,&a&a相同,其类型为&a[0](但int *的类型为&b)。

答案 2 :(得分:0)

new Type[x]返回的值的类型是Type *,即该类型的指针

examle: 所以正确的语法是  bool a;

*a = new bool[x];

所以这样做是错误的

a=new bool[x]错误的语法,因为将指针指定给普通的varibale

是无效的

see for more details