论C++如何优雅的使用数组

小编 2026-07-08 阅读:361 评论:0
C/C++中如果一个函数接受一个数组作为参数,那么数组将会被退化为指针,如果定义如下代码://数...

C/C++中如果一个函数接受一个数组作为参数,那么数组将会被退化为指针,如果定义如下代码:

//数组arr的大小未知。int arrsize(int arr*) {  cout << "element num : " << sizeof(arr) / sizeof(arr[0]) << endl; //1}
  • 1
  • 2
  • 3
  • 4

在上面那段代码中不仅得到的数组大小是不正确的,还会出现让调用则不明白是传递int变量的地址,还是传递一个指针(数组),为了解决第二个歧义现象,我们可以定义如下:

//数组arr的大小依旧未知。int arrsize(int arr[]) {  cout << "element num : " << sizeof(arr) / sizeof(arr[0]) << endl; //1}
  • 1
  • 2
  • 3
  • 4

即使我们按上面那种定义,但数组的的大小我们依旧不知道,但现在编译器还会提示类似如下警告:

 warning: ‘sizeof’ on array function parameter ‘arr’ will return size of ‘int*’ [-Wsizeof-array-argument]
  • 1

为了更好的解决上面的问题我们可以考虑使用一个引用形参,可以有如下代码:

//数组arr的大小必须是12,否则会报错。int arrsize_const_size(int (&arr)[12]) {  cout << "element num : " << sizeof(arr) / sizeof(arr[0]) << endl;//12}
  • 1
  • 2
  • 3
  • 4
  • 5

即使我们使用引用形参解决了,在函数内部我们无法正确获取数组大小的问题,但更复杂的问题出现了,我们只能接受固定数量的大小的数组,解决这个问题,我们可以通过一种很常规的手法定义函数如下:

 //指定一个数组大小nint arrsize_n(int arr[], int n) {}
  • 1
  • 2
  • 3
  • 4
  • 5

上面虽然解决了,但我们多传递了一个参数,调用代码看起来没有前两个更加简洁了,虽然问题被很好的解决了,为了更好的解决这个问题我们可以把推断数组大小的事交个编译器,使用非类型模板参数。

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;}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

下面给出完整的测试代码:

#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;}

如果array类型也是复用的话,那么就有最终版本:

template<typename T,int n>        void print_arr_in_tpl(T (&arr)[n]){            std::cout << "element num : " << sizeof(arr) / sizeof(arr[0]) << std::endl;//            for(int i=0;i<n;++i){                std::cout<<arr[i]<<std::endl;            }        }

 

哈哈, 大家拿去用吧




谋胆并重
版权声明

本文仅代表作者观点,不代表百度立场。
本文系作者授权百度百家发表,未经许可,不得转载。

热门文章
  • Sequential Monte Carlo Methods (SMC) 序列蒙特卡洛/粒子滤波/Bootstrap Filtering

    Sequential Monte Carlo Methods (SMC) 序列蒙特卡洛/粒子滤波/Bootstrap Filtering
    Problem Statement 我们考虑一个具有马尔可夫性质、非线性、非高斯的状态空间模型(State Space Model):对于一个时间序列上的观测结果{yt,t∈N}\\{ y_t , t \\in N \\}{yt​,t∈N},我们认为每个观测结果yty_tyt​的生成依赖于一个无法直接观察的隐变量xt∈{xt,t∈N}x_t \\in \\{x_t , t \\in N \\}xt​∈{xt​,t∈N},即:p(...
  • 机房智能化温湿度解决方式之POE供电以太网温湿度传感器

    机房智能化温湿度解决方式之POE供电以太网温湿度传感器
    机房智能化温湿度解决方式之POE供电以太网温湿度传感器 北京盈创力和电子科技有限公司 智能型TCP网口温湿度记录仪 北京IP网络温湿度记录仪厂家,北京盈创力和 北京智能型TCP网口温湿度记录仪IP网络温湿度记录仪是一种新型的基于TCP/IP协议双绞线以太网标准温湿度采集模块,利用它可以实现现场温度值、相对湿度值的采集,同时利用其自身的RJ45通信接口可以方便地和机房监控主机或交换机集线器进行联网。 工作于-40℃~85℃工业级带...
  • Hive 系统函数及示例

    Hive 系统函数及示例
    查看所有系统函数 show functions; 函数分类 内置函数【系统函数】 数学函数: floor、round、ceil、cos、log2等 字符串函数: length、reverse、trim、lower、get_json_object、repeat等 收集函数: size 转换函数: cast 日期函数: year、month、datediff、date、date_add等 条件函数: coalesce、case…w...
  • CSRF的原理和防范措施

    CSRF的原理和防范措施
    a)攻击原理:i.用户C访问正常网站A时进行登录,浏览器保存A的cookieii.用户C再访问攻击网站B,网站B上有某个隐藏的链接或者图片标签会自动请求网站A的URL地址,例如表单提交,传指定的参数iii.而攻击网站B在访问网站A的时候,浏览器会自动带上网站A的cookieiv.所以网站A在接收到请求之后可判断当前用户是登录状态,所以...
  • HTTP状态保持的原理

    HTTP状态保持的原理
    a)在用户登录之后,浏览器返回响应的时候会在响应中添加上cookieb)浏览器接收到cookie之后会自动保存c)当用户再次请求同一服务器中的其他网页的时候,浏览器会自动带上之前保存的cookied)服务接收到请求之后可以请 request 对象中取到cookie 判断当前用户是否登录  Http是无状态的,就是连接时数据互通,关闭后...
标签列表