int table[20][20];
int** table1 = table;
int a;
table[0][0] = 4;
a = table1[0][0];
最后一行给了我访问权限违规,我不明白..
提前感谢!
答案 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];
table
与int*
兼容,而不是int**
。
这应该可以编译,并且能够从table1
访问table1[0]
到table1[399]
:
int* table1 = table;
答案 5 :(得分:0)
问问自己:给定一个指针,并被告知要访问第3,4项 - 编译器应该如何知道二维数组的第一个维度有多大,以便跳过适量的物品?
正确:完全没有。