c++ 中sizeof 与数组形参

sizeof,返回表达式或类型名所占用的字节数。

int x[10];int* p = x;cout << sizeof(x)  << endl; //40,结果为数组占用的总空间cout << sizeof(*x) << endl; //4,结果为数组类型占用的空间cout << sizeof(p) << endl;  //4,结果为指针占用的空间cout << sizeof(*p) << endl; //4,结果为int占用的空间cout << sizeof(x) / sizeof(*x) << endl; //10cout << sizeof(p) / sizeof(*p) << endl; //1

数组两大特殊性质:

  1. 不允许拷贝数组。
  2. 使用数组时通常会将数组转换为指针。

所以,当数组作为函数形参时,由于性质1,无法进行值传递,所以实际上传入的是指向数组首元素的指针。举个粒子,如下函数:

void func(int* arr){int length = sizeof(arr)/sizeof(*arr);cout<<length<<endl;
}
int main(){int arr[6] = {9,1,1,2,3,7};func(arr);
}

我们将会看到,输出结果为1,因为我们的实参根据性质2转换成指针了,sizeof分别对指针和指针指向类型int运算,而上面我们知道他们得出的结果分别是4/4,所以我们并没有得到数组的长度。

C++允许将形参定义成数组的引用,将形参作为数组的引用。

int length(const int(&arr)[6]) {int length = sizeof(arr) / sizeof(int);return length;
}
int main(){int arr[6] = {1,1,2,3,7};int index = length(arr);cout << "index: " << index2 << endl;;
}

这样就可以传入数组实参,在函数中获得数组的长度了,但实际上这操作太蠢了,因为数组的大小我们也要同时传入,这带来极大不便,所以我们可以使用另一种方法:非类型模板参数。

非类型模板参数,当编译器实例化模板时,编译器可以推断出该参数值,绑定到此参数值的实参必须为常量表达式。写个二分模板如下:

template<typename _Ty,size_t Size>
int binary(const _Ty (&arr)[Size],_Ty target) {_Ty left = 0;_Ty right = sizeof(arr) / sizeof(_Ty) - 1;/*int mid = 0;*/while (left <= right) {_Ty mid = left + (right - left) / 2;if (arr[mid] == target) {cout<< "mid"<<mid  <<endl;return mid;}else if (arr[mid] < target) {left = mid + 1;}else if (arr[mid] > target) {right = mid - 1;}}return -1;}

c++ 中sizeof 与数组形参相关推荐

  1. 揭开C/C++中数组形参的迷雾楔子

    揭开C/C++中数组形参的迷雾楔子 去年,周星星大哥曾经在VCKBASE/C++论坛发表过一篇文章<"数组引用"以避免"数组降阶">*1,当时我不能 ...

  2. C语言试题三十五之找出一维整型数组元素中最大的值和它所在的下标,最大的值和它所在的下标通过形参传回。主函数中x是数组名,n 是x中的数据个数,max存放最大值,index存放最大值所在元素的下标。

    1. 题目 请编写一个函数function,它的功能是:找出一维整型数组元素中最大的值和它所在的下标,最大的值和它所在的下标通过形参传回.主函数中x是数组名,n 是x中的数据个数,max存放最大值,i ...

  3. 详解strlen和sizeof在数组中的使用(二)

    目录 一.前言 二.sizeof在字符数组中的题目 这整题sizeof的答案是: 32位平台下: 64位平台下: ​ 一.前言 前面我们已经提到了sizeof在整形数组的使用,因为strlen只能在字 ...

  4. C语言sizeof与数组中的使用详解

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.sizeof常见的使用方法: 二.sizeof在数组的使用详解: 总结 前言 提示:以下是本篇文章正文内容,下面案 ...

  5. 结对开发——返回一个整数数组中最大子数组的和 (首尾相接版)

    一.题目及题目要求 题目:返回一个整数数组中最大子数组的和. 要求: (1)输入一个整形数组,数组里有正数也有负数. (2)数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. (3)如果 ...

  6. C函数中返回字符数组

    原文 C函数中返回字符数组,CSDN同步发布. 转载请注明出处,谢谢! 强力推荐-不要错过,万一能帮助到自己呢? 朋友做了一个关于 人工智能的教程,教程不仅是零基础,通俗易懂,而且非常风趣幽默,像看小 ...

  7. 【php基础入门】PHP中常用的数组操作使用方法笔记整理(推荐)

    PHP数组 数组是对大量数据进行有效组织和管理的手段之一,通过数组的强大功能,可以对大量性质相同的数据进行存储.排序.插入及删除等操作,从而可以有效地提高程序开发效率及改善程序的编写方式. 数组:是一 ...

  8. sizeof获取数组长度

    昨天开始看<算法导论>这本书,第一个算法就是(直接)插入排序,根据书里给出的伪代码写出了C语言代码,也根据自己的理解重新写了一个.虽然实现了算法的基本要求,但有些细节没有处理好,今天就来完 ...

  9. 【C 语言】数组 ( 一维数组形参退化 | 二维数组形参退化 | 函数形参等价关系 )

    文章目录 一.一维数组形参退化 二.二维数组形参退化 三.数组形参等价关系 一.一维数组形参退化 C 中将 一维数组 作为参数 , 传递到函数中 , 该 一维数组 会退化为 指针 ; 将 int ar ...

最新文章

  1. Scikit-learn 数据预处理之鲁棒缩放RobustScaler
  2. ABAP的数据字典DDIC和Hybris Commerce的类型系统Type system
  3. linux命令补遗 - 4
  4. python爬虫爬取数据如何将br去掉_Python怎么去除爬取下来的网站中的一些转义字符串 - 收获啦...
  5. mysql5.1.7升级到5.6_1 MySQL5.6 升级到 5.7 版本
  6. (64)SPI外设驱动用户发送模块(三)(第13天)
  7. jmeter中变量的作用范围_Jmeter参数化方式总结
  8. L1-070 吃火锅 (15 分)-PAT 团体程序设计天梯赛 GPLT
  9. intel fortran免费版安装
  10. 连通区域的边界点程序
  11. 免费的视频转Gif软件
  12. 爱了爱了!ALIENWAER外星人AW410K机械键盘Cherry茶轴RGB灯光全键无冲!免费包邮送到家!...
  13. 这就是传说中的一行代码一句注释?Python每日一练----种花
  14. Python利用Face++实现身份证件图片识别
  15. steam网络游戏加速技术,针对任何联网进程或者游戏代理加速都行。
  16. 怒了!!!专科怎么了?搞学历歧视?专科这样做,照样牛掰!
  17. Google官方控件ShapeableImageView使用
  18. 【移动安全高级篇】————5、Andorid APK反逆向解决方案---梆梆加固原理探寻
  19. Dubbo 2 Dubbo 概述 2.1 Dubbo 概念 2.2 Dubbo 架构
  20. Android获取手机联系人的基本信息(如姓名、电话、邮箱、备注)

热门文章

  1. python matplotlib 画滚动图_Python下matplotlib常见图形绘制
  2. python如何调用ffprobe_如何让Python找到ffprobe?
  3. uniApp微信小程序唤出授权头像昵称(微信授权登录)弹窗,及服务端用户信息解密注意事项
  4. linux应用软件版本,在linux下查看各个应用程序的版本
  5. 论文阅读——LSQ+: Improving low-bit quantization through learnable offsets and better initialization
  6. [原创]我(们)开始跳舞了
  7. 乐高-丹麦的玩具品牌
  8. 从GE数字化业务大调整看工业互联网未来
  9. Matlab的数学原理,mathematical-Biology- 《生物数学原理》by肖燕妮 自己整理的这个书上的一些matlab程序 - 下载 - 搜珍网...
  10. Mac新手使用技巧——触控栏