将[] []放入**

时间:2012-12-25 22:07:44

标签: c++ c

  

可能重复:
  Passing two-dimensional array via pointer

int table[20][20];
int** table1 = table;
int a;
table[0][0] = 4;
a = table1[0][0];

最后一行给了我访问权限违规,我不明白..

提前感谢!

6 个答案:

答案 0 :(得分:13)

简短的回答是指向指针的指针与数组数组不同。

答案 1 :(得分:5)

你不能在一个赋值中从二维int数组中创建一个int **。首先,您需要分配正确数量的指针:     table1 = malloc(sizeof(int *)* 20);

然后你可以使用循环来填充你的下一级指针:

for(int i = 0; i < 20; i++)
    table1[i] = table[i];

原因是指向指针的指针是一个保存地址的内存位置。进行第一次分配时,会使该指针指向20个int指针。然后,我们为每个指针分配原始表中每行的第一个地址。现在,当我们使用a = table1[0][0]时,编译器将获取table1 [0] - 因此我们在循环中设置了数组中的第一个指针。这指向table [0]行,所以我们从中获取[0]元素,并获取那里填充的4 [当然,任何其他数字索引也会得到4,所以很难证明它有效在这种情况下)。

table[y][x]的情况下,编译器将获取表的地址,向其添加y * 20 * sizeof(int),然后添加x * sizeof(int)。这给了我们一个很好的位置,在“正方形”的内存块“桌子”。

(再次,输入太多,自我开始写这个以来还有两个答案)

答案 2 :(得分:1)

C编译器太宽容了:

int** table1 = table;

c.c:在函数'main'中: c.c:3:17:警告:从不兼容的指针类型初始化[默认启用]

如果我们提供不正确的代码,编译器会抱怨,我们会忽略投诉,然后得到一些奇怪的结果,我们应该想知道吗?

无论如何,table1没有指向指向int的指针,它崩溃的方式是实现的问题(对齐,分割等)。

答案 3 :(得分:0)

虽然table1[1]是类型指针,但table中的任何位置都没有指针。

答案 4 :(得分:0)

鉴于

int table[20][20];

tableint*兼容,而不是int**

这应该可以编译,并且能够从table1访问table1[0]table1[399]

int* table1 = table;

答案 5 :(得分:0)

问问自己:给定一个指针,并被告知要访问第3,4项 - 编译器应该如何知道二维数组的第一个维度有多大,以便跳过适量的物品?

正确:完全没有。