编写一个对数组进行操作的函数,并进行调用
一般形式举例:
int sum(int * arr, int n); // 函数原型
// 第一个参数把数组地址和类型信息传递给函数
// 第二个参数把数组中元素的个数传递给函数
int main(void)
{
...
int total;
total = sum(array_t, 10);
...
return0;
}
int sum(int *arr, int n)
{
int i;
int temp;
for(i = 0; i < 20; i++)
{
temp += arr[i];
}
return temp;
}
在函数原型或函数定义头的场合中(只有在这两种场合),可以用int *arr代替int arr[]
int sum(int arr[], int n);
无论在任何情况下,形式int *arr都表示arr是指向int的指针
由于数组名就是数组首元素的地址,因此如果实际参数是一个数组名,则形式参量必须是与之相匹配的指针
// 四种等价的函数原型
int sum(int * arr, int n);
int sum(int *, int);
int sum(int arr[], int n);
int sum(int [], int);
// 两种等价的函数定义
int sum(int * arr, int n)
{
...
}
int sum(int arr[], int n)
{
...
}
一、指针参数的使用
使用数组的函数需要知道数组何时开始和结束
向函数传递数组信息的2种方法:
1)使用一个指针参量确定数组的开始点(同时确定数组中数据的类型信息),使用一个整数参量指明数组的元素个数
2)传递两个指针,第一个指针指明数组的起始地址,第二个指针指明数组的结束地址
示例代码:
#include <stdio.h>
#define SIZE 10
int sum1(int * arr, int n);
int sum2(int * start, int * end);
int main(void)
{
int array_test[SIZE] = {2, 3, 8, 1, 12, 20, 5, 13, 55, 6};
int acc1, acc2;
acc1 = sum1(array_test, SIZE);
acc2 = sum2(array_test, array_test + SIZE);
printf("the total num of array_test by sum1 is: %d \n", acc1);
printf("the total num of array_test by sum2 is: %d \n", acc2);
}
int sum1(int *arr, int n) // 第一种方法
{
int temp = 0;
int i;
for(i = 0; i < n; i++)
{
temp += arr[i];
}
return temp;
}
int sum2(int * start, int * end) // 第二种方法
{
int temp = 0;
while(start < end) // end实际指向的位置在数组最后一个元素之后
// C保证在为数组分配存储空间时,指向数组之后的第一个位置的指针也是合法的
// 这种“越界”指针可使函数调用的形式更整洁
{
temp += * start;
start++; // start是指向int的指针,加1时增加的是一个int的大小
}
return temp;
}
运行结果:
二、指针和数组
处理数组的函数实际上是使用指针作为参数的
编写处理数组的函数时,数组符号和指针符号都可以选用
指针符号(尤其是对其使用增量运算符时)更接近于机器语言,使某些编译器在编译时可生成更高效率的代码