c++ 数组的大小 sizeof
2023-09-27 14:26:23 时间
在确定一个数组大小的时候我们一般用sizeof
int arr1[] = {1 , 2, 4 ,5}; int arr1_len = sizeof arr1/sizeof(int); std::cout<< "arr1 len: " << arr1_len << std::endl;
但是如果数组是函数的一个参数,我们就要把数组的大小也做为参数传入,换个方式说就是,如果数组做为参数,在函数内我们就不能使用sizeof来计算数组的大小?例:
int sum(int arr[], int len)
参数int arr[] 中括号为空表明可以传入任意长度的数组给函数。但是参数arr[]并不是数组,而是一个指针,但我们可以当作数组来使用。
一般情况下,数组名就是指针,c++将数组名解析为第一个元素的地址:
arr == &arr[0]
但也有例外,第一种:数组声明使用数组名来标记存储位置;第二种:对数组名使用sizeof将得到整个数组的长度(以字节为单位)
上面的方法 int sum(int arr[], int len)中 arr是数组名,也就是第一个元素的地址,因此函数传递的是地址 也就是一个int指针。所以函数等价于:
int sum(int *arr, int len)
我在main之上声明的函数 int sum(int arr[], int len); 定义我们用 int sum(int *arr, int len) 也是合法的
#include<iostream> int sum(int arr[], int len); int main() { int int_arr[] = {1, 2, 3}; int int_arr_len = sizeof int_arr/sizeof(int); auto total = sum(int_arr, int_arr_len); std::cout << "total: " << total << std::endl; } int sum(int arr[], int len) { int total = 0; for (int i = 0; i < len; i++) total += arr[i]; return total; } // 上面和下面是一样,两个同不能同时存在 int sum(int *arr, int len) { int total = 0; for (int i = 0; i < len; i++) total += arr[i]; return total; }
上面使用int *arr 替换了 int arr[] 都是正确的,在c++中,只有在函数头或函数原型中 int arr[]和 int *arr的含义是相同的。他意味着 arr是一个int 指针,不过数组表示法 int arr[]提醒用户, arr 不仅指向int,还指向int数组的第一个int。
arr做为函数参数,并没有把数组内容传递给函数,面是将数组的地址和类型(int)告诉了函数。所以在函数内使用sizeof是得不到正确的数组大小的。
int sum(int arr[], int len); int main() { int arr[] = {1, 2, 3, 4, 5}; std::cout << "sizeof: " << sizeof arr << std::endl; int arr_size = sizeof arr/ sizeof(int); sum(arr, arr_size); return 0; } int sum(int arr[], int len) { int total = 0; std::cout << "sizeof: " << sizeof arr << std::endl; for (int i = 0; i < len; i++) total += arr[i]; return total; }
相关文章
- C/C++数据结构(一) —— 数组
- 【VS开发】【编程开发】【C/C++开发】结构体中的数组与指针的内存分配情况说明
- C++标准模板库Stand Template Library(STL)简介与STL string类
- 剑指Offer系列(C++版,详细解析) 03. 数组中重复的数字
- C++-STL-组件(一)-容器02:vector(动态数组)【一维:vector<int> obj(m)】【二维:vector<vector<int>> obj(m, vector<int>(n)】
- C++:类名::函数名【单独引用某个类中的函数,或者在类外部定义类中的函数void classA::Func(){...}】
- 【dbus-cxx】libsigc++ 和 dbus-cxx 在 Ubuntu 中的编译和配置
- 十六进制字符串 char 数组 转换 c/c++/java
- linux下C++动态链接C++库示例详解
- [C++]PAT乙级1008.数组元素循环右移问题 (20/20)
- [C++]数组与指针[二维数组与指针]
- VS2017 C++代码报错:E0144 “const char *“ 类型的值不能用于初始化 “char *“ 类型的实体 解决方法
- C++从屏幕输入数字以空格分割,存入整型数组
- 传智播客 C/C++学习笔记 数组和指针的关系, 字符串学习
- C++ 一维数组vector<int>
- C++ 反调试(NtSetInformationThread)
- TRichView for Delphi Crack,原生Delphi/C++Builder组件
- 【足迹C++primer】32、定制操作_1
- C++012-C++一维数组
- C++之string的底层真的是用char数组来实现的么?
- VC++编程之道读书笔记(2)
- VC++、MFC最好的开源项目
- vc++基础班[28]---动态数组及动态链表的讲解
- 日常踩坑小记——C++条件变量
- c++20智能指针支持数组创建
- 六款常用的linux C/C++ IDE