【问题标题】:C- Incompatible pointer types initializing 'int *' with an expression of type 'intC-不兼容的指针类型用'int类型的表达式初始化'int *'
【发布时间】: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


【解决方案1】:

array of T 可以转换为T*matriceint[2]的数组,所以可以隐式转换为pointer to int[2],也就是可以这样写:

int (*prova2)[2] = matrice;

(但这显然不是你想要的)。

要获得指向第一个元素的指针,您可以这样做:

int* prova2 = &matrice[0][0];

【讨论】:

  • @immibis 但我知道 int A[] 可以转换为 int* A 。所以我可以像指针一样使用数组的名称 – ndPPhz 13 分钟前 也许,你不完全理解我的问题。用 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] 指向整数的指针。为什么会有这种差异?
  • 这很简单:vettore 的第一个地址包含一个整数对吗?但是,矩阵的第一个地址不包含整数,而是包含 3 个整数的数组。因此,解引用垫 *mat 不会产生整数作为变量类型声明。取消引用 mat 实际上会返回一个指向 3 个整数数组的指针。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-19
相关资源
最近更新 更多