1

当数组作为参数传递时,编译器会生成一个指向数组第一个元素的指针,并且该指针被传递给函数而不是整个数组,所以我的问题是为什么我们可以在打印时打印数组的值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;   

}
4

3 回答 3

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是一个数组,而不是指向数组初始元素的指针。在这个位置,编译器知道数组的大小是 a 的 8 倍int,因此除以 就可以sizeof(int)得到数组中元素的数量。

于 2013-02-12T23:50:33.833 回答
1

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

于 2013-02-12T23:50:24.593 回答
0

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

于 2013-02-12T23:51:00.010 回答