IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> c++ 中sizeof 与数组形参 -> 正文阅读

[C++知识库]c++ 中sizeof 与数组形参

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; //10
	cout << 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++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-09-20 15:36:17  更:2021-09-20 15:37:11 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 23:11:25-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码