2010-03-26 24 views
0

我有一个函数,它有时会与常规的,有时是动态的数组一起被调用。(gcc)用于无警告编译的多点阵列或双指针

如果我定义功能

function_name(int[10][10] a) 

和发送INT **作为参数,我得到一个警告。相反,如果我声明

function_name(int** a) 

和发送INT [] []作为参数(铸造后)我无法访问数组元素内的功能。

什么是相应的方法?

回答

1

当一个阵列被传递给函数,它“衰变”的指针到它的第一元件。所以,下式给出:

T a[10]; 
f(a); 

在呼叫f(a)a实际上是&a[0],即,指针,和类型是T *(的&a[0]类型)。

当你有数组的数组中,相同的规则应用于:

T a[10][5]; 
f(a); 

a衰减到指针再次,等于&a[0]a[0]是“T”的“阵列[5]”类型。所以,&a[0]的类型是“指针数组[5]的T”,即,如果你要声明指针p设置等于&a[0],你会做:

T (*p)[5]; /* parentheses because [] binds tighter than * */ 
p = &a[0]; 

鉴于上述情况,并假设您的阵列在所调用的代码​​宣布,应声明你的函数为:

function_name(int (*a)[10]); 

如需更多信息,请参阅this

function_name(int[10][10] a) —中存在语法错误,您需要在“变量”名称后指定数组大小:function_name(int a[10][10])。实际上,由于上​​面提到的“衰减”,以上相当于function_name(int (*a)[10])

编辑:啊,我想我现在明白了。由于上述原因(指针的“衰减”只发生一次),您不能声明既采用“二维”数组又采用指针指针的函数。指向指针的指针可能不指向连续的数据,并且可能在每个“行”中具有不同数量的元素。一个数组数组不能有这些属性。他们根本不同。

1

int **int [][]是不一样的。 前者是pointer to pointer to int,而第二个是int的二维数组。

int[][] decays to int (*)[] when you pass it as argument to function.

void func(int arr[][10]) { //decays to `int (*arr)[10]` 
    printf("%d correct", arr[1][9]); //10th element of 2nd row 
    //printf("%d correct", (*(arr + 1))[9]); //same as above 
} 

int main() { 
    int (*arr)[10]; //pointer to array of ints 
    arr = malloc(sizeof(int (*)[]) * 2); //2 rows & malloc will do implicit cast. 

    arr[1][9] = 19; 
    func(arr); 

    return 0; 
}