数组指针在两种类型的声明中存在差异

时间:2013-12-12 23:01:10

标签: c arrays pointers

下面这段代码有什么问题吗?

int x[3][12];
int *ptr[12];
ptr=x;

2 个答案:

答案 0 :(得分:3)

是的,无法使用以下消息进行编译:

'=' : cannot convert from 'int [3][12]' to 'int *[12]'

说明:

这里x是一个2维的整数数组,而ptr是一个指向int的指针数组。

语句ptr=x正在尝试将x(这是一个2维的int数组)分配给ptr(这是一个指向int的指针数组)。

如果您要将ptr声明为

int (*ptr)[12];

相反,那么ptr将是一个指向int数组的指针,因为指向int数组的指针与int的2维数组基本相同(int数组只是指向第一个数组的指针数组中的元素和一个2维的int数组只是一个指向第一个int数组的指针,然后就会编译。

或者考虑一下:

int x[3][12];
int *ptr[12];
ptr[0] = x[0];

这是对指向int的指针的int数组的有效赋值(请注意,x的第二维与ptr相同的事实不是为什么这样做)

答案 1 :(得分:1)

查看:C pointer to array/array of pointers disambiguation

我对此有点兴趣并做了一个有效的例子:

#include <stdio.h>

int main (int argc, char * argv[])
{
  int i,j;
  int x[3][12];    // An array of arrays with lenght 12
//int *wrong[12];  // An array of pointers to ints.
  int (*ptr)[12];  // A pointer to an array of ints

  /* Initialization to consequtive numbers*/
  for ( i = 0; i < 12*3; i++)
  {
    /* Get the first index, and go from there */
    int *number = &(x[0][0])+i;
    *number = i;
  }


  /* Iterate throug and check that the pointers are the same */
  for ( i = 0; i < 3 ; i ++ )
  {
    /* This will generate a warning: 
     * assignment from incompatible pointer type [enabled by default]
     */
    ptr = x[i];

    fprintf(stderr,"Numbers in ptr: ");
    for ( j = 0; j < 12; j ++)
      fprintf(stderr,"%2d ", (*ptr)[j]);
    fprintf(stderr,"\n");

    fprintf(stderr,"Numbers in x:   ");
    for ( j = 0; j < 12; j ++)
      fprintf(stderr,"%2d ", x[i][j]);
    fprintf(stderr,"\n");
  }

  return 0;
}

输出结果为:

Numbers in ptr:  0  1  2  3  4  5  6  7  8  9 10 11 
Numbers in x:    0  1  2  3  4  5  6  7  8  9 10 11 
Numbers in ptr: 12 13 14 15 16 17 18 19 20 21 22 23 
Numbers in x:   12 13 14 15 16 17 18 19 20 21 22 23 
Numbers in ptr: 24 25 26 27 28 29 30 31 32 33 34 35 
Numbers in x:   24 25 26 27 28 29 30 31 32 33 34 35