【发布时间】:2016-01-12 23:44:21
【问题描述】:
我有一个问题,我不明白为什么编译器会告诉我这个警告:
使用“int [2][2]”类型的表达式初始化“int *”的不兼容指针类型
int matrice[2][2]={4,7,3,6};
int* prova2=matrice;
for (int i=0; i<4; i++) {
printf("%d",*(prova2+i));
}
从逻辑上讲,它有效,但我想知道为什么 IDE 会显示给我。 我尝试对数组做同样的事情,但它可以在没有任何警告的情况下工作。
我知道当我声明一个数组时
int a[4];
a 包含数组在内存中分配的地址。 因此,
之间没有差异(类型差异)int a[4];
或
int *b= a;
为什么会有区别
int matrice[2][2]
和
int* prova2=matrice;
?
【问题讨论】:
-
int matrice[2][2]={{4,7},{3,6}};或int matrice[4]={4,7,3,6};。 -
"a 包含数组在内存中分配的地址" int a[4]; 表示 a 包含 4 个 int,
int *b表示 b 包含一个地址。 -
奇怪的是,“数组指针等价”的神话在 C 语言近半个世纪后仍然存在。我猜它是从一代比老人更了解的新手传给下一代的.
-
@immibis 但我知道 int A[] 可以转换为 int* A 。所以我可以像指针一样使用数组的名称
-
也许,您并没有完全理解我的问题。用 int vettore[4]={5,10,7,8}; int *ptr=vettore;即使 vettore 是 int[4] 类型并且 ptr 是指向 int 的指针,我也不会收到警告。使用 int 矩阵[3][3]={1,3,5,7,9,11,13,15,17} ; int *mat=矩阵;编译器告诉我,我正在尝试使用 int[3][3] 指向整数的指针。为什么会有这种差异?
标签: c++ c arrays pointers multidimensional-array