C++引用形参+模板---解决数组指针退化为指针
来源:互联网 发布:湖南纳米娱乐网络 编辑:程序博客网 时间:2024/06/06 14:04
C/C++中如果一个函数接受一个数组作为参数,那么数组将会被退化为指针,如果定义如下代码:
//数组arr的大小未知。int arrsize(int arr*) { cout << "element num : " << sizeof(arr) / sizeof(arr[0]) << endl; //1}
在上面那段代码中不仅得到的数组大小是不正确的,还会出现让调用则不明白是传递int变量的地址,还是传递一个指针(数组),为了解决第二个歧义现象,我们可以定义如下:
//数组arr的大小依旧未知。int arrsize(int arr[]) { cout << "element num : " << sizeof(arr) / sizeof(arr[0]) << endl; //1}
即使我们按上面那种定义,但数组的的大小我们依旧不知道,但现在编译器还会提示类似如下警告:
warning: ‘sizeof’ on array function parameter ‘arr’ will return size of ‘int*’ [-Wsizeof-array-argument]
为了更好的解决上面的问题我们可以考虑使用一个引用形参,可以有如下代码:
//数组arr的大小必须是12,否则会报错。int arrsize_const_size(int (&arr)[12]) { cout << "element num : " << sizeof(arr) / sizeof(arr[0]) << endl;//12}
即使我们使用引用形参解决了,在函数内部我们无法正确获取数组大小的问题,但更复杂的问题出现了,我们只能接受固定数量的大小的数组,解决这个问题,我们可以通过一种很常规的手法定义函数如下:
//指定一个数组大小nint arrsize_n(int arr[], int n) {}
上面虽然解决了,但我们多传递了一个参数,调用代码看起来没有前两个更加简洁了,虽然问题被很好的解决了,为了更好的解决这个问题我们可以把推断数组大小的事交个编译器,使用非类型模板参数。
template<int n>int arrsize_template_size(int (&arr)[n]) { cout << "element num : " << sizeof(arr) / sizeof(arr[0]) << endl;//12 cout << "n : " << n << endl;//12 for (int i = 0; i < n; i++) { cout << "arr[" << i << "] = " << arr[i] << endl; } return 0;}
下面给出完整的测试代码:
#include <iostream>using namespace std;//数组arr的大小未知。int arrsize(int arr[]) { cout << "element num : " << sizeof(arr) / sizeof(arr[0]) << endl;//1 return 0;}//数组arr的大小必须是12,否则会报错。int arrsize_const_size(int (&arr)[12]) { cout << "element num : " << sizeof(arr) / sizeof(arr[0]) << endl;//12 return 0;}//指定一个数组大小nint arrsize_n(int arr[], int n) { return 0;}template<int n>int arrsize_template_size(int (&arr)[n]) { cout << "element num : " << sizeof(arr) / sizeof(arr[0]) << endl;//12 cout << "n : " << n << endl;//12 for (int i = 0; i < n; i++) { cout << "arr[" << i << "] = " << arr[i] << endl; } return 0;}int main() { int arr[12] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, }; int arr1[16] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, }; arrsize(arr); arrsize_const_size(arr); cout << "-------------------------------------" << endl; arrsize_template_size(arr); cout << "-------------------------------------" << endl; arrsize_template_size(arr1); cout << "-------------------------------------" << endl; return 0;}
0 0
- C++引用形参+模板---解决数组指针退化为指针
- 数组退化为指针
- 参数传递时数组引用保护数组退化为指针
- 参数传递时数组引用保护数组退化为指针
- c 数组做为形参时 该参数退化为指针
- C/C++中数组名退化为指针的情况
- 数组做参数退化为指针
- 数组做函数参数退化为指针
- 数组作为参数时,退化为指针。
- C++参数传递,数组引用传递,保护数组退化为指针
- C++参数传递,数组引用传递,保护数组退化为指针
- 指针(一)数组名退化为指针
- C语言中,数组名作为参数传递给函数时,退化为指针
- C语言中,数组名作为参数传递给函数时,退化为指针
- C语言中,数组名作为参数传递给函数时,退化为指针
- 数组名作为函数参数时会退化为指针
- 数组名作为函数参数时,退化为指针
- 数组名降级 数组退化为指针 问题
- Ubuntu调出搜狗输入法
- [6]Linux文件编程
- Angular过滤器(filter)
- CodeForces - 733D Kostya the Sculptor (STL SET)
- 洛谷 1147_连续自然数和
- C++引用形参+模板---解决数组指针退化为指针
- SQL SERVER分区具体例子详解
- matlab str2double与str2num
- 夕拾算法进阶篇:12)出栈序列统计(动态规划DP)
- javascript正则表达式(1)——RegExp对象与常用字符
- POJ 1163 The Triangle
- matlab 一条语句跨越多行
- Android 6.0 for X86
- 《UVM实战》,一个简单实例的源代码理解