(C Primes Plus)第十章 数组和指针——4.0

10.4 函数、数组和指针

前文部分,调用函数进行数组求和,应用到了指针、函数的知识

要编写一个处理数组的函数,该函数返回数组中所有元素之和,待处理的数组名为"marbles",类型为"int"。如何调用函数?、
  total = sum(marbles);//可能的函数调用

  • 该函数的原型,数组名是该数组首元素的地址,所以实际参数marbles是一个储存int类型值的地址,应把它赋给一个指针形式参数,即形参是一个指向int的指针
  • int sum(int *ar);//对应的函数原型
  • sum()从参数获得了数组首元素的地址,该参数并未包含数组个数信息,让函数获得数组元素个数的方法一:
int sum(int *ar)//sum函数定义
{
    int i;
    int total = 0;
 for (i=0;i<10;i++) /*假设数组有个10个元素,该方法只能计
算10个int类型的元素*/
 toatl +=ar[i];//a[i]与*(ar+i)相同
return total;

方法二(把数组的大小作为第2个参数):

int sum(int *ar, int n)//更通用的方法
{
    int i;
    int total = 0;
    for (i = 0;i < n; i++)//使用n个元素
        total += ar[i]; //a[i]与*(ar+i)相同
    return total; //数组元素的和
}

方法二第1个形参告诉函数该数组的地址和数据类型,第2个形参告诉函数该数组中元素的个数。
int *ar形式和int ar[]形式都是表示ar是一个指向int的指针。int ar[]只能用于表示形式参数,只能用于函数原型或函数定义中,同时提醒读者指针ar指向的不仅仅是一个int类型值,还是一个int类型数组的元素。
注意 声明数组形参
  因为数组名是该数组首元素的地址,作为实际参数的数组名要求形式参数是一个与之匹配的指针。只有这样(ar是指向int的指针),C才会把int ar[]和int *ar解释成一样。由于函数原型可以省略参数名,所以以下4种原型等价:
int sum(int *ar, int n);
int sum(int *, int );
int sum(int ar[], int n);
int sum(int [], int );

在函数定义中不能省略参数名。下面两种形式的函数定义等价:
int sum(int *ar, int n)
{
//其他代码省略
}
int sum(int ar[], int n);
{
//其他代码省略
}

原文程序案例如下,增加了一些基于前文的理解注释:

//sum_arr1.c——数组元素之和
//如果编译器不支持%zd,用%u或%lu替换它
#include <stdio.h>
#define SIZE 10
int sum(int ar[], int n);//ar[]出现警告,*ar不会出现
int main(void)
{
    int marbles[SIZE] = {20, 10, 5, 39, 4, 16, 19, 26, 31, 20};
    long answer;
    answer = sum(marbles, SIZE);/*sum函数中marblers的
    类型为指针,数组的指针为首元素的指针。*/
    printf("The total number of marbles is %ld.\n", answer);
    printf("The size of marbles is %zd bytes.\n", sizeof marbles);
    return 0;
}
int sum(int ar[], int n)
{
    int i;
    int total = 0;
    for (i = 0;i < n; i++)
        total += ar[i]; //ar[i]为数组元素的值
    printf("The size of ar is %zd bytes.\n", sizeof ar);
    return total; //数组元素的和
}

运行结果如下:
The size of ar is 8 bytes.
The total number of marbles is 190.
The size of marbles is 40 bytes.
会出现一个警告:
‘sizeof’ on array function parameter ‘ar’ will return size of ‘int *’ [-Wsizeof-array-argument]
将代码中的"ar[]“改成”*ar"警告消失,个人理解前者能提醒读者,后者更通用。
刚开始看没有仔细阅读前文有些懵,通过文中解读及前文回归终于算理清楚了,这也是记录的初衷之一,个人函数结果解读:
“The size of ar is 8 bytes.”,调用函数内printf函数输出结果,8对应"sizeof ar",“ar"指向数组"marbles"首元素的指针,我们系统中用8字节储存地址,所以指针变量的大小是8字节)。
“The total number of marbles is 190.”,main函数第一个printf函数输出结果,190是answer的值,来自于sum函数返回的数组元素之和,数组调用"marbles”。
The size of marbles is 40 bytes.main函数第二个printf函数输出结果,40是"sizeof marbles"的值,数组的大小,数组含10个int类型的值,每个值占4字节(百度了一下C语言基础定义int类型占4字节,之前也学过前面算了强化复习了一下),因此是一共是40字节。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值