我有一个关于二维数组的c指针的问题。我们经常写:
int (*p)[3]=a //here a is a 2d array
但写作:
int (*p)[3]=a[0]
和
int (*p)[3]=&a[0]
生成的结果与a
的基址相同。如果我们cout p
,它会产生与*p
相同的结果。
为什么会发生这一切。
答案 0 :(得分:0)
本声明
int (*p)[3]=a[0]
无效,编译器应发出错误。右操作数的类型为int *
,而左操作数的类型为int (*p)[3]
这些陈述
int (*p)[3]=a
int (*p)[3]=&a[0]
是等价的,因为右侧的数组a被隐式转换为指向其第一个元素的指针。
至于陈述
std::cout << p;
和
std::cout << *p;
然后它们产生相同的结果,因为它们输出分配数组的memort的地址。 * p相当于a [0]并隐式转换为指向其第一个元素的指针,即&amp; a [0] [0]。所以在这两种情况下它实际上都是[0] [0]的地址,因为数组是从第一行开始的行放在内存中的。
答案 1 :(得分:0)
首先:您的代码无效,因为不兼容的类型之间没有强制转换。
右侧表达式中使用的数组名称被隐式转换为指向数组第一个元素的指针。这是正在发生的事情:
#include <iostream>
using namespace std;
int main() {
int a[][2] = { {0,0}, {1,1}, {2,2}};
int (*p)[3]=(int(*)[3])a; // implicitly converted from array name to pointer to the first element (int(*)[2])
int (*p2)[3]=(int(*)[3])a[0]; // a[3][2], access a[0], an array, implicitly converted to int*
int (*p3)[3]=(int(*)[3])&a[0]; // Address of int[2] array, int(*)[2] type
cout << p << endl;
cout << p2 << endl;
cout << p3 << endl;
// your code goes here
return 0;
}
答案 2 :(得分:0)
这是因为数组变量基本上是地址。
因此a[0]
将指向第一个1D数组的基地址,因为{{ 1}}本身是 2D数组。