数组作为函数形式参数的使用学习

<<C++ Primer>> 第四版中Exercise Section 7.2.5 中有习题7.13如下:编写程序计算数组元素之和。

首先,数组作为形式参数有两种,第一种是引用形式,第二种是非引用形式。

引用形式:参数传递时带上了数组的大小,这样只能传递进大小一样的数组。

非引用形式:参数传递时没有带上数组大小,这样会导致在编译时,只要传递的是相类型的指针,那么编译都是可以通过的。

针对非引用形式的数组形参传递,数组会被转换为指向第一个元素的指针,复制这个指针的值并用来初始化形参。因此下面三个形式的形参声明其实是一样的,形参类型都是 int*

int fun(int *p)

int fun(int p[])

int fun(int p[10])

 

看下面的例子:

#include "stdafx.h"
#include <iostream>
using namespace std;
void printValues(int arr[10])
{
    for (size_t i = 0; i < 10; ++i)
    {
        cout << arr[i] << endl;
    }
}

int main()
{
    int i[2] = {1,2};
    int *p = 0;
    int pc[] = {0,1,2,3,4,5,6,7,8,9};
    printValues(pc);
    printValues(i);
    printValues(p);
    return 0;
}

 

 

代码全部被编译通过,但是当执行时,结果会变成这样:

 

这里只要是int 型的指针传递进函数printvalues,编译都通过了,但是程序运行时,却抛出异常。

 

再来看引用参数的传递:

#include "stdafx.h"
#include <iostream>
using namespace std;
void printValues2(int(&arr)[10])
{
    for (size_t i = 0; i < 10; ++i)
    {
        cout << arr[i] << endl;
    }
}
int main()
{
    int i[2] = {1,2};
    int *p = 0;
    int pc[] = {0,1,2,3,4,5,6,7,8,9};
    printValues2(pc);
    printValues2(i);
    printValues2(p);
    return 0;
}

这里代码:

printValues2(i); 编译提示错误:

printValues2(p);编译提示错误:



注释掉这两行后,程序编译通过,运行成功,打印出pc 数组的各个值。

较为常见的是传递非引用数组类型的作为参数。这样做有一个关键点就是如何确
保程序能够处理数组范围之内的数据。书上列举出了三种方式:

1
在数组末尾放置一个标识符,用来标识数组末尾。类似的情况就像C风格字符串。
2 使用标准库方式,传入数组第一个元素的指针和最后一个元素的指针。
3 显式传递数组大小。

先看第一种方式:

#include "stdafx.h"
#include <iostream>
using namespace std;
void printValues_01(int *p)
{
    while (*p)
    {
        cout << *p++ << endl;
    }
}
int main()
{
    int temp = 0;
    int i[3] = {1,2,NULL};
    int *p = &temp;
    int pc[] = {1,2,3,4,5,6,7,8,9,NULL};
    printValues_01(pc);
    return 0;
}

 

打印出的结果为:


第二种方式为:

#include "stdafx.h"
#include <iostream>
using namespace std;
void printValues_02(const int* begin,const int* end)
{
    while (begin!=end)
    {
        cout << *begin++ << endl;
    }
}
int main()
{
    int temp = 0;
    int i[3] = {1,2,NULL};
    int *p = &temp;
    int pc[] = {1,2,3,4,5,6,7,8,9,NULL};
    printValues_02(pc,pc+10);
    return 0;
}

第三种方式多加一个参数即可。

 







 

 
 

 

 

 

posted on 2017-03-03 21:21  ^~~^  阅读(11973)  评论(0编辑  收藏  举报

导航