C++ 如何将数组地址分配给指针? #包括 int main(){ int-arr[2]={1,2}; int*p; //p=&arr;//不编译 p=&arr[0];//编译 标准::cout
C++ 如何将数组地址分配给指针? #包括 int main(){ int-arr[2]={1,2}; int*p; //p=&arr;//不编译 p=&arr[0];//编译 标准::cout,c++,c++11,C++,C++11,p=&arr; 是一个编译器错误,因为&arr的类型是int(*)[2]--指向“2个ints数组”的指针。因此,它不能分配给p,其类型是int* 即使&arr和&arr[0]计算为相同的数值,但它们是不同的类型。因此您有: #include <iostream> int main() { int arr[2] = {1, 2}; int *p; // p = &arr; // Does not compile p = &arr[0]; // com
p=&arr;
是一个编译器错误,因为&arr
的类型是int(*)[2]
--指向“2个int
s数组”的指针。因此,它不能分配给p
,其类型是int*
即使&arr
和&arr[0]
计算为相同的数值,但它们是不同的类型。因此您有:
#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;
}
这相当于以下内容:
arr[0] is the first item in memory
arr[1] is the second item in memory
“取消引用”指针,这允许您访问所需的内存,而不是在内存中表示它的数字(指针):
这相当于:
*((int*)arr + 0)
如果您需要任何项目的地址,可以按如下所示操作:
arr[0]
第一项的地址是数组开头的内存地址,因此数组和第一项的地址是:
(int*)arr + Index
此处的代码获取第一项的地址,该地址与数组的地址相同:
(int*)arr + 0 or just (int*)arr
每当您放置一个与(&)符号时,它就相当于获取的地址,因此这里您得到的是[数组地址的地址],这与数组的[地址不同
p = &arr[0]; // compiles
数组地址的地址类型为:
p = &arr; // Does not compile
不是:
这就是为什么它不编译,类型不匹配
<>帮助类相关的错误,比如,可以使用Type和DeCype,在C++中,这样可以打印所讨论的类型的名称。
像这样
int *p;
typeid中的“p”表示指针,“A”表示数组
您可以在这里玩:
p=&arr[0]
编译是因为&arr[0]
是数组第一个元素的地址。我怀疑p=&arr
没有编译,因为arr
已经是内存地址。请尝试p==arr;
@RobertHarveyarr
是数组,而不是内存地址address@M.M它是一个地址,数组中第一个元素的地址。数组降级为指针。@R注意,它们可以在适当的上下文中转换为指针……但是数组不是指针,就像5
是double
一样,因为可以使用void f(double);f(5);
&arr
也不是这样的上下文。M.M是对的,请看我文章的结尾,我用typeid来显示它。@Pocke,在这种上下文中,arr
与&arr[0]
相同。你知道为什么arr与&arr[0]相同吗“PokChh”,标准定义了这样的方式。参见。在C和C++中,数组变量本质上是指向数组中第一个项目的指针。对谷歌进行“数组衰变”的搜索。数组的名称表示数组的基址。在语句p=arr中,您将数组arr的地址存储到有效的指针p中。因此,您说int**p=&arr;?这是错误的;数组地址的类型是int(*)[2]
,而不是int**
我知道强制转换应该是静态强制转换,但在本例中更为详细。要更改还是不更改。Pocke,不抱歉,这是一个错误。类型如typeid所示,数组的类型是数组。指向该类型的指针只是指向该类型或int(*)的指针[2]。
int (*)[2];
int *p;
#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)