2010-12-10 117 views
4

我知道这是一个古老的栗子,但我想要一个静态分配在我的代码中的小二维数组。我知道这样做的方法是:C中的二维数组初始化

static int A[3][2] = { { 1, 2 }, { 3, 4 }, { 5, 6 } }; 

这很好,我可以访问它的所有成员。但是我有几个问题,把它传递给一个函数,例如:

void print_matrix(int **a, int r, int c) 
{ 
    int x, y; 

    for(x = 0; x < r; x++) 
    { 
     printf("Row %02d = %#x = ", x, a[x]); 

     for(y = 0; y < c; y++) 
     { 
      printf("%s%d", (0 == y) ? "" : ", ", a[x][y]); 
     } 
     printf("\n"); 
    } 
} 

首先,我不能简单地传递A的功能,我需要将其转换为(INT **)。由于char *char []是同义词,所以我对此有点惊讶。其次,它崩溃,当我检查调试器时,在子函数中,a[0]报告为1,而不是指向整数数组的指针。

我知道这里发生了编译器/ C语言奥术魔法。但它有点令人困惑。如果我尝试初始化为:

static int *A[3] = { { 1, 2 }, { 3, 4 }, { 5, 6 } }; 

我收到很多警告。这是如何的不同而不同:

static char *S[3] = { "hello", "there", "stackoverflow" }; 

除了奥术魔法ç的问题,这在某种程度上我从来尽管在C语言编程的十年:(,我想学会懂得我的生成数组这样我就可以顺利通过它作为一个int **而不必通过的for循环所有FAG或复制静态分配的数组动态分配一个。

将在下面的工作?

int *A0 = { 1, 2 }; 
int *A1 = { 3, 4 }; 
int *A2 = { 5, 6 }; 
int **A = { A0, A1, A2 }; 

有没有比这更好的方法呢?

谢谢,所有。

P.s.我知道在现实生活中,我们会从数据库或文件中读取数值到动态分配的数组中,并避免所有这些。

+4

这验证码的东西提交问题很烂!第一个字母有两个字母重叠,第二个字母全部模糊,完全不可读!我做了音频挑战,几乎听不到第二部分。 – AlastairG 2010-12-10 14:12:59

回答

9

一个多维数组不会成为一个多级指针(我不知道适当的术语)。只有一个维度衰减。例如:

int [20]变成int *; int [20][5]变成int (*)[5](它不是int **);等等。

如果有很大的愿望使用多维数组(通过[r][c]语法),那么你必须通过其他边界(它必须是常量)。如果需要可变边界,我认为最好的选择是手动执行索引转换(即不是a[r][c],请使用a[r*C + c])。

+2

在C99中,可以像这样定义函数:“void f(int c,int a [] [c])...”或“void f(int c,int(* a)[c]).. “。在此之后,您可以像任何其他多维数组一样索引数组。 – tiftik 2010-12-10 15:06:21

3

我会从咨询this question in the C FAQ开始,然后是entire section

+3

嗯,我希望有一两句话能清楚地描述答案,而不必通过参考文献的页面。尽管如此,他们仍然是后代的很好的参考,所以谢谢。 – AlastairG 2010-12-10 14:36:38

1

最快的方法是声明参数aint a[][2]

void print_matrix(int[][2] a, int r, int c); 

// and call the function like this: 
print_matrix(A, 3, 2); 
+0

不起作用。不管怎么说,还是要谢谢你。 – AlastairG 2010-12-10 14:32:14

+0

这是c,所以'void print_matrix(int a [] [2],)''。 – lijie 2010-12-10 15:23:57

0
static char *S[3] = { "hello". "there", "stackoverflow" }; 
          // ^~~~~~ This is a period. 
+0

但是你*看过完整的问题吗? :-) – Eiko 2010-12-10 14:35:47

+0

已修复,但仅仅发现错字没有意义。 – AlastairG 2010-12-10 14:40:15

2
int A0[2] = { 1, 2 }; 
int A1[2] = { 3, 4 }; 
int A2[2] = { 5, 6 }; 
int *A[3] = { A0, A1, A2 }; 

你是密切与最后一节,但无需略有不同的声明。得到的A可以作为int **传递给函数。

有了这个,print_matrix(A, 3, 2);输出:

Row 00 = 0x5eaeda70 = 1, 2 
Row 01 = 0x5eaeda68 = 3, 4 
Row 02 = 0x5eaeda60 = 5, 6