C++给函数传数组参数C++给函数传数组参数

C++给函数传数组参数

在C++中,如果要给一个函数传入一个数组,一般都是传入两个参数一个数组指针和一个数组大小

例:
void print_1 (int n, int *datas )
{
    for (int i = 0; i < n; ++i)
    {
        std::cout << datas[i] << " ";
    }
    std::cout << std::endl;
}

对这个函数,我们可以这样使用它:
const int N = 3;
int datas[N] = {1, 2, 3};
print_1 (N, datas);

不过对这个函数,我们可能会传错 n 的大小,而在运行时可能出错,例如这样使用:
const int N = 3;
int datas[N] = {1, 2, 3};
print_1 (4 , datas);


有些时候,我们希望某函数只接受指定大小的数组,例如我们希望只接受大小为 3 的数组:
void print_2 (int datas[3] )
{
    for (int i = 0; i < 3 ; ++i)
    {
        std::cout << datas[i] << " ";
    }
    std::cout << std::endl;
}

但实际上,上面的函数不能正确工作:
const int N = 3;
int datas[N] = {1, 2, 3};
print_2 (datas);

int datas2[N - 1] = {1, 2};
print_2 (datas2);
 

也就是我们传入了一个大小为 2 的数组,编译器没报任何错误,我们的函数接口 print_2 (int datas[3 ]) 中的 3 没起任何作用


事实上,上面的函数接口应该这样写:
void print_3 (int (&datas) [3])
{
    for (int i = 0; i < 3; ++i)
    {
        std::cout << datas[i] << " ";
    }
    std::cout << std::endl;
}

这时,我们如果这样使用是正确的
const int N = 3;
int datas[N] = {1, 2, 3};
print_3 (datas);

而我们如果这样使用,编译器会报错
int datas2[N - 1] = {1, 2};
print_3 (datas2);


在上面这个例子(print_3)的基础上,我们可以使用模板进行泛型实现
template<int N>
void print_4 (int (&datas)[N])
 
{
    for (int i = 0; i < N; ++i)
    {
        std::cout << datas[i] << " ";
    }
    std::cout << std::endl;
}

这时候,我们可以传递任意大小数组,而不担心给函数传入了错误的参数
const int N = 3;
int datas[N] = {1, 2, 3};
print_4 (datas);

int datas2[N - 1] = {1, 2};
print_4 (datas2);

假如我们给传了错误参数,函数将会报错
const int N = 3;
int datas[N] = {1, 2, 3};
print_4<4 > (datas);

C++中二位数组作为函数参数


变量在作用域里面被声明的是什么类型,就当作什么类型来用。

(1)参数是二维数组,但是要指定第二维的维数。

int array[10][10];

函数声明:void fuc(int a[][10]);

函数调用:fuc(array);

——在函数fuc中,a是二维数组。使用a[i][j]形式来访问数组中元素。

(2)参数使用一维指针数组。

int *array[10];

for(i = 0; i < 10; i++)

    array[i] = new int[10];

函数声明:void fuc(int *a[10]);

函数调用:fuc(array);

——在函数fuc中,a是一维指针数组。使用*(a[i] + j)形式来访问数组中元素。

(3)参数使用指针的指针。

int **array;

array = new int *[10];

for(i = 0; i <10; i++)

    array[i] = new int[10];

函数声明:void fuc(int **a);

函数调用:fuc(array);

——在函数fuc中, a是指针的指针。使用*(int *)(a + i*d2 + j)形式来访问数组中元素。其中:

a[0]<=>array[0][0],

a[1]<=>array[0][1],

a[10]<=>array[1][0]

注:d2为二维数组的二维维数,即列数。并且a + i*d2 + j为地址,所以要把这个类型为指针的指针的地址强制转换为指针来使用

转载自:http://blog.csdn.net/hongjiqin/article/details/5739935 

http://www.cnblogs.com/growup/archive/2011/03/01/1971529.html

阅读更多

扫码向博主提问

xiamentingtao

随便问吧,无论学术还是人生
  • 擅长领域:
  • cv
  • math
  • 考博
  • 算法
  • AI
去开通我的Chat快问
个人分类: C++基础算法
上一篇C++标准库与Java基础类对照表
下一篇doxygen问题集锦
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭