为什么将指向数组的指针传递给需要指向int的指针的函数,可以正常工作

时间:2012-10-24 07:30:48

标签: c multidimensional-array

出于好奇,我将set_array(&array1[0])中的行更改为set_array[array1],参数类型不同,但是它有效吗?

#include <stdio.h>
void set_array(int array[][9]);
int main(void) {
    int array1[4][9];
    for(int i = 0; i < 4; i++) {
        for(int j = 0; j < 9; j++) {
            array1[i][j] = j + 1;
        }
    }
    set_array(&array1[0]);
    for(int i = 0; i < 4; i++) {
        for(int j = 0; j < 9; j++) {
            printf("%d ", *(*(array1 + i) + j));
            //printf("%d ", array1[i][j]);
        }
        puts("\n");
    }
    return 0;

}
void set_array(int array[][9]) {
    for(int i = 0; i < 4; i++) {
        for(int j = 0; j < 9; j++) {
            array[i][j] = 1;
        }
    }   
};

2 个答案:

答案 0 :(得分:6)

在C中,数组的普通名称与指向其第一个元素的指针相同。这称为阵列的衰减。有关详细说明,请参阅C faq

答案 1 :(得分:1)

这里array1具有第一行(或列)的整个数组的地址,具体取决于实现。 (&array1[0])(array1)类型的()[n]相同.sice数组名称本身包含ist元素的地址。但是当您传递(&array)类型()[m][n]时,编译器会抛出错误,因为参数类型不匹配。

我想你在上一个问题中没有看过我的评论