一维数组的调用
(int* a)或者(int a[])
二维数组的调用
(int a[][数组长度])——这种方式调用的函数知道得到的是指向数组的指针,那么用[i][j]应该是可以的
(int **a)?——这种方法大概在调用取地址是用二维数组转化为一维数组的方式[i*n+j]
(第一种情况,你用函数g接收到的只是一个二级指针,但是它又怎么知道这是一个二维数组的指针呢?所以用c[i][j]来取得里面的值是不对的. 而用c[i*i+j] 来取值的话就可以了,因为这二维数组其实也是一维存储的,因为它在内存里面是连续的, 用c[i*i+j]就是根据成员在数组里面的位置取得值 )
===============
大家的说法:
1)不仅是二维数组,实际上任何多维数组都可以用一维数组的形式访问,你要找到公式,这里以二维数组为例说明:
设有一二维数组:
S[2][3]={
1,5,2,
2.8.7,
}
则其中数组元素"8",可以用二维数组的形式a[2][2]=8表示,也可以用一维数组表示为S[4],实际上多维数组的存贮与一维数组的方式是一样的, 按顺序一个接一个存放的,所以可以把多维数组当做一维数组一样来算它的位置,并搂一维数组aaa(int *数组名)进行访问.请多看一下这方面的书,
有一个通用公式可以将多维数组中的任一元素位置转化为一维数组表示时的位置的用,但一我忘了,好多书上都有.
2)应该是 int (*c) [2];
这个表达式说明,c是一个指针,并且是指向 int[2]类型的指针
3)c[3][2]跟(*c)[2做函数参数的时候两者就是一样的啊,第一维度会被忽略的啊~~
但是作为函数内的声明当然就不一样了,数组和指针本来就不能划等号。
作为参数的时候,int c[][2]和int (*c)[2]都是一个指向int [2]的指针,而int**c是一个指向int*的指针。前两个的c[i]的类型是int [2],后一个c[i]的类型是int*。前两个c+1会加int[2]的空间== 2*4,而后一个c+1会加int*的空间==4