Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何将数组地址分配给指针? #包括 int main(){ int-arr[2]={1,2}; int*p; //p=&arr;//不编译 p=&arr[0];//编译 标准::cout_C++_C++11 - Fatal编程技术网

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;
@RobertHarvey
arr
是数组,而不是内存地址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)