数组作为函数的参数

时间:2013-02-12 23:48:16

标签: c pointers

当一个数组作为参数传递时,编译器会生成一个指向数组第一个元素的指针,并且该指针被传递给函数而不是完整数组,所以我的问题是为什么我们可以在打印数组的值时我们打印array[i]

void FunctionApi(int array[])
{
    int i;
    for(i=0;i<8;i++)
    {
         printf("Value =%d\n",array[i]);
         //I understand the reason behind the following two lines but not the above          line.
         //printf("noOfElementsInArray=%d\n",*array);
         //*array++;
    }

}

int main()
{
    int array[8]={2,8,10,1,0,1,5,3};
    int noOfElementsInArray;
    noOfElementsInArray=sizeof(array)/sizeof(int); 
    printf("noOfElementsInArray=%d\n",noOfElementsInArray);
    FunctionApi(array);
    return 0;   

}

3 个答案:

答案 0 :(得分:2)

数组的元素一起存储在连续的位置。这就是为什么知道初始元素的地址足以知道其余元素的位置的原因。

唯一的技巧是知道数组有多少元素。这不会与数组一起传递,因此您需要单独传递它。它不是你的程序所关心的,因为你把它硬编码为8,但一般来说,如果你把数组作为参数传递,你还需要将它的大小作为一个单独的参数传递:

void FunctionApi(int array[], size_t count) {
    int i;
    for(i=0;i<count;i++) {
        printf("Value =%d\n",array[i]);
    }
}

noOfElementsInArray=sizeof(array)/sizeof(int);计算而言,此技巧仅适用于调用者,其中array是数组,而不是指向数组初始元素的指针。在这个位置,编译器知道数组的大小是int大小的八倍,因此除去sizeof(int)可以得到数组中元素的数量。

答案 1 :(得分:1)

因为array[i]在语法上等同于*(array + i)

答案 2 :(得分:0)

当您传递数组的名称时,这是指向第一个元素以及整个数组的指针。因此,当您访问array[i]的不同元素时,您将访问等同于*(array + i)的连续数据。