void fun(int array[10]) { int *p = &array[-1]; //p = &array[0] - 1; cout<<"function:fun()"<<endl; cout<<"address of array: "<<array<<endl; cout<<"address of p: "<<p<<endl; cout<<"sizeof(array): "<<sizeof(array)<<endl; array[2]= 80; cout<<"---------------change array[2]-------------"<<endl; cout<<"array[2]= "<<array[2]<<endl; } int main(int argc, char* argv[]) { int array[5] = {5, 4, 3, 2, 1}; cout<<"function:main()"<<endl; cout<<"address of array: "<<array<<endl; cout<<"sizeof(array): "<<sizeof(array)<<endl; cout<<"---------------before change array[2]-------------"<<endl; cout<<"array[2]= "<<array[2]<<endl; fun(array); cout<<"---------------after change array[2]-------------"<<endl; cout<<"array[2]= "<<array[2]<<endl; return 0; }
今天面试遇到了上面这个问题:用下标-1访问形参是数组的参数,问该调用方式是否有问题? 在搞清楚这个问题之前,先得明白两个问题:
1. 数组作为函数参数,传值还是传址?
2. void fun(int array[10])和void fun(int array[])有区别么?
3. 函数参数中的数组元素个数能否确定?
输出结果:
function:main()
address of array: 0012FF6C
sizeof(array): 20
---------------before change array[2]-------------
array[2]= 3
function:fun()
address of array: 0012FF6C
address of p: 0012FF68
sizeof(array): 4
---------------change array[2]-------------
array[2]= 80
---------------after change array[2]-------------
array[2]= 80
由输入地址都是0012FF6C以及fun函数内部修改下标为2的数组元素,即修改了main函数中定义的array数组元素值,由此我们可以得出结论:
数组作为函数参数是传址,该地址就是数组的首地址。
由于在fun函数中sizeof(array)求得值是4,所以可知:函数参数中的数组元素个数信息已经丢失,函数已经把数组作为指针来传递。因而void fun(int array[10])和void fun(int array[])根本就没区别。
再来看:int *p = &array[-1];我们把它拆解成:p = &array[0] - 1;实际上就是array地址-1,由于是int型指针,所以的array地址减4,输入结果也是这样的。
C/C++面试题--数组作为函数参数的几个问题
最新推荐文章于 2022-08-29 19:01:17 发布