我认为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]|
为什么这样做会有效?
答案 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
变量(NULL
或0xacf3de
)中的值。它是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