我可以使用[] []访问类型int(*)[]吗?

时间:2010-06-04 12:00:40

标签: c pointers casting multidimensional-array

来自这个问题“What does (int (*)[])var1 stand for?”我试图像多维数组一样访问演员表的结果。但我收到以下错误:“assignment from incompatible pointer type”后面跟着一个细分错误。我也尝试了其他一些变化,但没有一个变化。如何直接访问函数var1example中的元素?

谢谢!

 #include <stdlib.h>

int i(int n,int m,int var1[n][m]) {
  var1[0][0]=5;
  return var1[0][0];
}

int example() {
  int *var1 = malloc(100);

  // works
  int var2;
  var2 = i(10,10,(int (*)[])var1);
  printf("var2=%i",var2);
  //doesn't work I
  int *var3;
  var3=(int (*)[])var1; //"assignment from incompatible pointer type"
  printf("var3[0][0]=%i",var3[0][0]);


  //doesn't work II
  int *var4;
  var4=var1;
  printf("var4[0][0]=%i",var4[0][0]); //" error: subscripted value is neither array nor pointer"

  //doesn't work III
  int **var5;
  var5=var1;
  printf("var5[0][0]=%i",var5[0][0]); // assignment from incompatible pointer type


  return(1); 

} 

int main(){
  int a;
  a=example();
  return(1);
}

5 个答案:

答案 0 :(得分:3)

int *var3;
var3 = (int (*)[])var1;

您正在向var1投射int* int(*)[](指向int数组的指针)并将其分配给var3,而int*再次为var3 = var1

只做

{{1}}

答案 1 :(得分:1)

给它一个机会。以下编译时没有警告,并在C99(gcc -std=c99 -pedantic -Wall)下运行:

#include <stdio.h>
#include <stdlib.h>

int i(int n, int m, int (*var1)[m]) // C89 requires constant expression for
{                                   // array size
  int j, k;
  for (j = 0; j < n; j++)
    for (k = 0; k < m; k++)
      var1[j][k] = j*m+k;
  return var1[0][0];
}

int example(void)
{
  int *var1 = malloc(100 * sizeof *var1);   // Thanks, Joseph!
  int var2 = i(10, 10, (int (*)[10]) var1); // note the cast of var1 includes
                                            // the array size
  int (*var3)[10] = (int (*)[10]) var1;     // note the type of var3

  int j, k;
  for (j = 0; j < 100; j++)
    printf("var1[%2d] = %d\n", j, var1[j]);

  for (j = 0; j < 10; j++)
    for (k = 0; k < 10; k++)
      printf("var3[%2d][%2d] = %d\n", j, k, var3[j][k]);

  free(var1);
  return var2;
}

int main(void)
{
  int x = example();
  printf("x = %d\n", x);
  return 0;
}

首先,请注意类型和演员表(最重要的是,请注意它们是如何匹配的)。请注意,我在指向数组的转换中指定了数组维度的大小。另请注意,我将var3声明为指向数组的指针,而不是简单的指针。

答案 2 :(得分:0)

var3必须是int**而不是int*

修改

您正在尝试使用2D数组语法,其中您创建的实际数据实际上是一维数组。您可以使用i()函数为您提供所需的语义,但需要将数据访问转换为函数内的1D索引。只需让你的功能看起来像这样:

int i(int n,int m,int* var1, int maxM) {
  return var1[(maxM * n) + m];
}

答案 3 :(得分:0)

int example() {
    int *var1 = malloc(100);

    ...

    int *var3;
    var3=var1;
    printf("var3[0][0]=%i",var3[0][0]); //" error: subscripted value is neither array nor pointer"

    return(1); 
} 

此处,var1var3都属于int*类型,大致类似于int[]。您已经创建了一维数组,并尝试将它们作为二维数组进行访问。将他们的类型更改为int**,分配必要的内存,这应该可以解决您的问题。

答案 4 :(得分:0)

也许您正在寻找的是:

int (*var1)[10][10] = malloc(sizeof *var1); // 400 bytes
i(10, 10, *var1);
printf("var1[0][0]=%i\n", (*var1)[0][0]);

已添加: gcc 的完整代码片段可能是:

#include <stdio.h>
#include <stdlib.h>

void i(int n, int m, int var1[][m]) { // n not needed
    var1[0][0] = 5;
    var1[1][2] = 6;
}

int main(void) {
    int n = 10, m = 10;
    int (*var1)[n][m] = malloc(sizeof *var1); // 400 bytes
    i(n, m, *var1);
    printf("var1[0][0]=%i\n",(*var1)[0][0]);
    printf("var1[1][2]=%i\n",(*var1)[1][2]);
    return 0;
}

对于 msvc ,您需要制作n和m 常量,如下所示:

enum {n = 10, m = 10};

void i(int var1[][m]) {
    var1[0][0] = 5;
    var1[1][2] = 6;
}

int main(void) {
    int (*var1)[n][m] = malloc(sizeof *var1);
    i(*var1);
    // ...
}