传递数组fun(int a [])和fun(int *a )的区别

答案就是没区别!!

今天在写排序算法时,看到函数都是以void InsertionSort(T Array[], int N)形式写的,就觉得很奇怪,函数想要修改实参不是应该通过值传递或者指针传递吗? 为什么这里也可以修改主函数里的实参?通过查阅资料与实验,发现上文的写法其实不是值传递,而是指针传递,可以当做fun(int *a )理解:

截选程序:

void InsertionSort(T Array[], int N)

{

//输出形参大小

cout << sizeof(Array) / sizeof(T) << endl;

//输出形参的地址

cout << Array<<endl;

....

int main()

{

int Arr[10] = { 1,2,8,4,3,9,5,7,2,12 };

cout << Arr << endl;

print(Arr,10);

....

结果如下:


地址一样,大小为1,所以跟fun(int *a )基本一样,更详细的对比:(原文地址http://www.cnblogs.com/yanlingyin/archive/2011/12/06/2277821.html)

对于编译过程中数组会转化为指针的情况,数组和指针可以互换,比如:声明为函数参数的时候 fun(int a [])和fun(int *a )是等同的。因为编译的过程中fun(int a [])

中的数组会转化为指针形式,也就和fun(int *a )的效果一样了。

如果编译到时候数组不被当做指针处理,那么声明的时候不能等同。对于这种情况,数组和指针是不一样的的,在运行时的表示形式也不一样,并可能产生不同的代码。

对编译器而言,一个数组就是一个地址,一个指针就是地址的地址。

c语言标准对此做了如下说明:

1)An array name in an expression (in contrast with a declaration) is treated by the compiler as a pointer to the first element of the array 
(paraphrase, ANSI C Standard, paragraph 6.2.2.1).

2)A subscript is always equivalent to an offset from a pointer (paraphrase, 

ANSI C Standard, paragraph 6.3.2.1).

3)An array name in the declaration of a function parameter is treated by 

the compiler as a pointer to the first element of the array (paraphrase, ANSI 
C Standard, paragraph 6.7.1).

即:

1)表达式中的数组名(与声明不同)被编译器当做一个指向该数组第一个元素的指针

2)下标总是与偏移量相同

3)在函数参数的声明中,数组名被编译器当做指向该数组第一个元素的指针



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值