函数和数组的小知识点笔记

来源:互联网 发布:hbase是关系数据库吗 编辑:程序博客网 时间:2024/05/18 12:04

1.函数使用指针来处理数组

程序示例一:

#include <iostream>using namespace std;int sumFun(int arr[],int count);const int SIZE = 10;int main(){    int sum=0;    int array[SIZE]={1,2,3,4,5,6};    sum=sumFun(array,SIZE);    cout<<"The total of array is "<<sum<<endl;    return 0;}int sumFun(int arr[],int count){    int total=0;    for (int i=0;i<count;i++)    {        total+=arr[i];    }    return total;}

输出结果:The total of array is 21

可以注意到在函数原型中,int sumFun(int arr[],int count),arr是数组名,c++中将数组名解释为其第一个元素的地址:arr==&arr[0],而在函数调用中,我们传递的就是地址值,sum=sumFun(array,SIZE),因此我们还可以有以下声明int sumFun(int* arr,int count),这里用int* arr代替了int arr[],两种声明都是正确的,都可以用于函数头或函数原型中。

2.使用const保护数组

创建以数组作为参数的函数很简单,只需将数组名和填充的元素数目传递给函数即可。但是有一个问题——即确保函数不会修改原始数据,除非函数的目的本来就是修改传递给他的数据,否则应该避免发生原始数据被修改的情况。
为了防止函数无意中修改原始数据,可以在函数原型声明形参时使用关键字const
比如,
int sumFun(const int* arr,int count)
该声明表示,指针arr指向的是常量数据,意味着不能用arr修改数据,但这并不意味着原始数据必须是常量,而只是意味着不能在 sumFun函数中使用arr来修改数据,因此 sumFun函数将数组视为只读数据比如,无意间在 sumFun函数中修改了数组值,*arr[2]=4;编辑器将禁止这样做。

3.使用数组区间的函数

对于处理数组的c++函数,必须将数组的种类、起始位置和数组中的元素数目提交给它,传统的方法是,将指向数组起始位置的指针作为一个参数,将数组长度作为第二个参数,传递给函数,这样便可以找到所需的所有数据。而还有另一种给函数提供所需信息的方法,即指定区间元素,这可以通过传递两个指针来完成,一个指针标识数组的开头,一个指针标识数组的尾部。

程序实例一修改:

函数定义:

int sumFun(const int* begin,const int* end){    const int* pt;    int total=0;    for(pt=begin;pt!=end;pt++)    {        total+=*pt;    }    return total;}

函数调用:

sum=sumFun(array,array+SIZE);

输出结果:The total of array is 21

4.函数和二维数组

为编写将二维数组作为参数的函数,必须牢记,数组名将被视为地址,相应的形参是一个地址,就像一维数组一样,比较难处理的是如何正确声明指针。
比如,有下面的代码:

int data[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};

函数调用:int total=sum(data,3);

那么函数sum的原型是什么呢,它的定义又是什么呢?函数为何将行数3作为参数,而不用列数4作为参数呢?

data是一个数组名,该数组有三个元素,第一个元素本身就是包含4个int元素的数组,因此,data的类型是指向由4个int组成的数组的指针。正确的原型如下:

int sum(int (*ar)[4],int size);

还有另一种格式,含义同上,但可读性更强

int sum(int ar[][4],int size);
原创粉丝点击