再学C语言37:函数、数组和指针

编写一个对数组进行操作的函数,并进行调用

一般形式举例:

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;
}

运行结果:

二、指针和数组

处理数组的函数实际上是使用指针作为参数的

编写处理数组的函数时,数组符号和指针符号都可以选用

指针符号(尤其是对其使用增量运算符时)更接近于机器语言,使某些编译器在编译时可生成更高效率的代码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Forster-C

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值