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