传递数组引用——数组作为形参时的最优解决方案

传值、传指针、传引用的区别:

值传递,指针传递,当发生函数调用时,需要给形参分配空间,当传递的是对象是,要调用拷贝构造函数。
而且指针最后析构时,要处理内存释放问题。
引用传递,在内存中没有产生形参。效率大大提高!也不用处理指针的析构问题。

数组作为形参弱化成为指针:

数组有两个特性,影响作用在数组上的函数:一是不能复制数组,二是使用数组名时, 数组名会自动指向其第一个元素的指针。
因为不能复制,所以无法编写使用数组类型的形参,数组会自动转化为指针。

这里写图片描述
这里写图片描述

这里因为编译器忽略了为任何数组形参指定长度,所以会造成数组内存越界问题。上面的[10]仅表示我们希望数组是多大。
把 const int *ia 改为 const int ia[ ],效果完全一样,都是数组指针。

数组作为形参的几种解决方案:

方案一:传指针,并显示传递表示数组大小的形参

这里写图片描述
这里写图片描述

    此方法虽然可以解决问题,但效率没有传递引用高。
方案二:传数组的引用

这里写图片描述
这里写图片描述

结果显示,与pass by pointer方法结果一致,但是这里有一个缺陷,这里面 int (&ia)[2],编译器要检查数组实参和形参的大小。
上面这个这个函数只能处理元素个数为2的数组,通用性太差。
最终方案:传引用,采用非类型模板参数

这里写图片描述
这里写图片描述

字符数组作为形参:

void fun1(char str[ ], int n)
{
cout << "len = " << strlen(str) << endl;//只要有'\0',strlen可用
    cout << sizeof(str)/sizeof(char)<<"  ";//打印的是sizeof(指针),所以要把数组长度n传入=》数组弱化为指针
    str[1] = 'X';//可以改变实参
}
void fun2(char* str, int n)
{
cout << "len = " << strlen(str) << endl;//只要有'\0',strlen可用
    cout << sizeof(str) / sizeof(char) << "  ";//打印的是sizeof(指针),所以要把数组长度n传入
    str[1] = 'X';//可以改变实参
}

int main()
{
    char str[4] = { 'a', 'b', 'c', '\0'};

    cout << "fun1: ";
    fun1(str, 4);
    for (char ch : str)
    {
        cout << ch;
    }
    cout << endl;

    cout << "fun2: ";
    fun2(str, 4);
    for (char ch : str)
    {
        cout << ch;
    }
    cout << endl;

    system("pause");
    return 0;
}
    以上两种方法在调用函数中算不出sizeof(str), 算出来总是一个指针所占的字节数。
最终方案:传引用,采用非类型模板参数

这里写图片描述

这种方法可以在调用函数中求出字符数组所占的空间。
  • 20
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值