C/C++面试题--数组作为函数参数的几个问题

4 篇文章 0 订阅
4 篇文章 0 订阅
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,输入结果也是这样的。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值