#include <iostream>
int main() {
int arr[2] = {1, 2};
int *p;
// p = &arr; // Does not compile
p = &arr[0]; // compiles
std::cout << "&arr = " << &arr << std::endl;
std::cout << "&arr[0] = " << &arr[0] << std::endl;
}
当我尝试打印地址时,两者都打印相同的地址。但是,当我尝试分配p = &arr
时,它不会编译。标准中是否有某些内容反对将数组的地址分配给指针。我只想知道p = &arr
无法编译的原因?
C语实际上是说error: cannot initialize a variable of type 'int *' with an rvalue of type
答案 0 :(得分:3)
p = &arr;
是编译器错误,因为&arr
的类型为int (*)[2]
-指向“ 2个int
s数组”的指针。因此,无法将其分配给类型为p
的{{1}}。
尽管int*
和&arr
的计算结果相同,但它们是不同的类型。
答案 1 :(得分:-1)
所以你有这个:
arr[0] is the first item in memory
arr[1] is the second item in memory
这等效于以下内容:
*((int*)arr + 0) is the first item in memory
*((int*)arr + 1) is the second item in memory
“取消引用”指针,它使您可以访问所需的内存,而不是代表其在内存中的数字(指针):
*((int*)arr + 0)
这等效于:
arr[0]
如果您想要任何物品的地址,可以按以下所示操作:
(int*)arr + Index
第一项的地址是数组开头的内存地址,因此数组AND的地址与第一项是:
(int*)arr + 0 or just (int*)arr
您的代码在这里获取第一项的地址,该地址与数组的地址相同:
p = &arr[0]; // compiles
每当您放置一个与号(&)等同于获取其地址时,因此在这里您将获取[数组地址的地址],这与[ 阵列的地址]
p = &arr; // Does not compile
数组地址的地址类型为:
int (*)[2];
不是:
int *p;
这就是为什么它不编译,类型不匹配的原因。
为帮助解决此类与类型相关的错误,您可以使用typeid和decltype,在C ++中,这可以让您打印所涉及类型的名称。
赞
#include <iostream>
using namespace std;
int main()
{
int arr[2] = {1, 2};
std::cout<< "typeid ptr_array is " << typeid(decltype(&arr)).name() << "\n";
std::cout<< "typeid ptr_item is " << typeid(decltype(&arr[0])).name() << "\n";
return 0;
}
结果是:
ptr_array is PA2_i (Pointer to Array of size 2 with int)
ptr_item is Pi (Pointer to int)
来自typeid的“ P”表示指针,“ A”表示数组。