// C Prime Plus, Page 656
/*
int marbles[10];
如果要计算这个数组所有元素的和,函数的可能调用形式如下:
int total = sum(marbles)
数组名 marbles是它的第一个元素的 地址,而地址(指针)是个整型数(int)
也就是说形参marbles实际是传递了个地址,因此可以用个int *p 指针来构造函数原型:
所以相应的函数原型如下:
int sum(int *ar)
本来是求数组的和,居然是可以用指针来表达.
*/
int sum(int *ar)
{
int i;
int total=0;
for(i=0;i<10;i++)
total+=*(ar+i) ; // *(ar+i)实际是取地址对应的值,然后把地址偏移一个单元,即必须是一块连续的内存.
// 或者 total+=ar[i],这样直接把指针变量写成了数组,但是不便于理解
// ar[i] is the same as *(ar+i)
//--
return total;
}
如果把10也作为参数传递进去:
int sum(int *ar,int n)
{
int i;
int total=0;
for(i=0;i<n;i++)
total+=ar[i] ; // ar[i] is the same as *(ar+i) ,但是对刚刚学C人来说不好理解.一个指针形参直接当做数组来使用了.
//--
return total;
}
/*
从函数原型的语境上,显然 可以用 int ar[] 替代 int *ar,也就是函数原型可以是这样的:
int sum(int ar[],int n);
所以 int *ar 和 int ar[] 在本例中是等同的
但是,很显然从语法上讲, int *ar 表示为指向int类型变量的指针 即 pointer-to-int
而 int ar[] 则表示为int类型的数组,它只有在作为形参的时候,才表示为指向int
类型变量的指针,即pointer-to-int
在数组作为参数的申明中,以下4种形式是等价的(函数原型的申明中,是可以省略参数名称的)
int sum(int *ar,int n);
int sum(int *,int);
int sum(int ar[],int n);
int sum(int [],int);
*/