传递数组引用——数组作为形参时的最优解决方案
程序员文章站
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), 算出来总是一个指针所占的字节数。
最终方案:传引用,采用非类型模板参数
这种方法可以在调用函数中求出字符数组所占的空间。
上一篇: 求教一个简单的显示问题