C++ C++;指针的数组地址分配
我对指针的概念非常陌生,最近遇到了以下代码行:C++ C++;指针的数组地址分配,c++,arrays,pointers,C++,Arrays,Pointers,我对指针的概念非常陌生,最近遇到了以下代码行: int arr[]={1,2,3}; int (*p)[3] = &arr; 上述代码行与以下代码行之间的区别是什么: int arr[]={1,2,3}; int *p = arr; 为什么会出现这样的错误: int arr[]={1,2,3}; int *p = &arr; 它们只是不同的东西 int arr[]={1,2,3}; int (*p1)[3] = &arr; // pointer to array (
int arr[]={1,2,3};
int (*p)[3] = &arr;
上述代码行与以下代码行之间的区别是什么:
int arr[]={1,2,3};
int *p = arr;
为什么会出现这样的错误:
int arr[]={1,2,3};
int *p = &arr;
它们只是不同的东西
int arr[]={1,2,3};
int (*p1)[3] = &arr; // pointer to array (of 3 ints)
int *p2 = arr; // pointer to int
p1
是指向数组(3个整数)的指针,然后初始化为指向arr
p2
是指向int的指针,因此,它被初始化为指向arr
的第一个元素
然后您可以将它们用作:
(*p1)[0]; // same as arr[0]
p1[0][1]; // same as arr[1], note p1[1] will be ill-formed.
p2[0]; // same as arr[0]
类型差异 中的
p
类型
int (*p)[3] = &arr;
是int(*)[3]
,即指向3
int
s数组的指针
p
in的类型:
int *p = arr;
只是int*
,即指向int
的指针
因此,
在第一种情况下
*p
计算为3个int
s的数组,即int[3]
在第二种情况下
*p
的计算结果仅为int
要获取
arr
的第一个元素,您必须在第一种情况下使用(*p)[0]
或p[0][0]
要获取arr
的第一个元素,必须在第二种情况下使用*p
或p[0]
要获取
arr
的最后一个元素,您必须在第一种情况下使用(*p)[2]
或p[0][2]
要获得
arr
的最后一个元素,您必须在第二种情况下使用*(p+2)
或p[2]
。我想您应该在其他地方学习编程,因为这里的人不喜欢它。e、 这是一个不太坏的问题,除了第三部分,它是标准阵列衰减,在这里有很好的解释:它是一个“类型”的东西。一旦你能准确地描述每种情况下p
的类型,以及你赋予它的表达式类型,那么就可以清楚地说明为什么前两个例子编译时没有抱怨,为什么第三个没有抱怨。