答案就是没区别!!
今天在写排序算法时,看到函数都是以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)在函数参数的声明中,数组名被编译器当做指向该数组第一个元素的指针