void func(int (&arr)[10])
{
cout<<arr[0];
}
|
此时调用func必须用有10个int元素的数组调用,否则会有编译错误。这就限制了该函数的使用范围。注意:上面例子中的形参是int (&arr)[10],这里的括号不能少,否则若是int &arr[10]就表示arr是一个有10个int引用类型元素的数组。
如果要使函数能在传递数组时同时传递其大小,并且可以针对不同大小的数组,可以使用函数模板来完成这项工作,例如:
template<typename T, size_t N>
void func(T (&arr)[N])
{
cout<<arr[0];
}
|
在这里运用了模板的非类型模板参数来传递数组大小,可以针对各种大小的数组。在编译时,编译器根据实参数组的大小来确定N值,从而可以让这个函数适用于各种大小的数组。编译后,对于不同的大小的数组会实例化相应的函数类型(实质上相当于对不同大小的数组进行函数重载,只是这枯燥的工作让编译器代做了)。
------------------------------------------------------------------------------
C++ 通过成员函数参数返回成员数组的值
通常对数组类型进行保护做法是这样的。
class A {
public :
A {}
~ A {}
enum {
MAX_VAL_COUNT = 10;
};
void getArraryValues(int (* pVal)[MAX_VAL_COUNT]) { memcpy(pVal,m_aVal,MAX_VAL_COUNT); }
或
void getArraryValues(int (& eVal)[MAX_VAL_COUNT]) { memcpy(&eVal,m_aVal,MAX_VAL_COUNT); }
或
void getArraryValues(const int* & eVal)) { eval = static_cast<int *>(m_aVal); }
private :
int m_aVal[MAX_VAL_COUNT]
}
上面的代码对类型加了强的限定,这样可以防止用户传入数组长度不够长,或防止类用户误修改私有成员内容
(当然这里类用户还是可以通过显式类型转换修改类私有成员)。
尽管如此,在C++中还是最好使用vector代替数组
#include <vector>
using namespace std;
class A {
public :
A {}
~ A {}
enum {
MAX_VAL_COUNT = 10;
};
void getArraryValues(vector& vVal) { vVal = m_vVal }
private :
vector<int> m_vVal[MAX_VAL_COUNT]
}
-----------------------------------------------------------------------------------------------------------------------------------
/*程序作者:管宁
站点:www.cndev-lab.com
所有稿件均有版权,如要转载,请务必著名出处和作者*/
#include <stdio.h>
main()
{
void search_score(); /* 定义自定义涵数类型为不返回型 */
void count_avg(); /* 定义自定义涵数类型为不返回型 */
static float a[3][4]={{97,45.5,66,77},{88,92.5,78.5,66},{83,74.5,92,100}}; /* 输入3个学生的各自4门课的成绩 */
search_score(a,0); /* 调换自定义涵数显示其中一个同学的各门课成绩 */
count_avg(*a,12); /* 调换自定义涵数显示3个同学各门课的平均成绩成绩 */
/* 注意上面的*a其实也就是a[0]或者是&a[0][]0将这行改写成count_avg(a[0],12);或者count_avg(&a[0][0],12)也都是对的 */
}
void search_score(p,n)
float (*p)[4]; /* 定义一个指针变量p,说明它是一个指向一个包含4个整型变量一维数组的指针 */
int n; /* 定义形式参数n为整形 */
{
int i; /* 定义用于循环的变量i */
for (i=0;i<4;i++ ) /* 这里循环4次用于打印一个同学的4门课成绩 */
{
printf("%7.2f",*(*(p+n)+i));
}
printf("\n");
}
void count_avg(p,n)
float *p;
int n;
{
float *p_end;
float sum = 0;
float avg;
p_end = p+n-1; /* 计算出最后一个数组元素的地址 */
for (;p<=p_end;p++) /* 循环到最后一个元素地址就停止 */
{
sum += *p;
}
avg = sum/n;
printf("avg=%7.2f\n",avg);
}
/*
注意此题的意思在于输入3个同4门课的成绩,计算出平均值和显示其中一个同学的4门课成绩,此例是对多维数组指针和多维数组
的指针作为涵数参数传递的总结,认真联系和体会可以很好的了解多维数组指针的概念到底是什么!
*/