欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2024-02-18 16:37:22
...

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

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

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

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

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

这里因为编译器忽略了为任何数组形参指定长度,所以会造成数组内存越界问题。上面的[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), 算出来总是一个指针所占的字节数。

最终方案:传引用,采用非类型模板参数

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

这种方法可以在调用函数中求出字符数组所占的空间。