当前位置: 首页 > news >正文

c语言-------sizeof()函数讲解 (数组作为参数传递时,是否能在传递过后求该数组的大小呢?)

int  a[10] = {2,3,4,5,6,7,8,9,10} ;

n = sizeof(a) / sizeof(*a) ;

这个实际是在求a占用了多少个int(类型)位,即 10

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
今天在写程序 时,发现如下代码运行有问题:

int a []= {1,2,3,4};
    
multPacket(a);

void MainWindow::multPacket(int dest[])
{
    int member=sizeof(dest)/sizeof(int);//表示成員個數
    qInfo()<<sizeof(dest)<<endl;
    qInfo()<<sizeof(int)<<endl;
    for(int i=0;i<member;i++)
    {
        qInfo()<<dest[i];
    }
}

通过输出结果发现,只能输出第一个和第二个元素 ,即dest[0], dest[1] ,添加了两行输出代码后,发现sizeof(dest)竟然长度为8(64输出是8,32位输出是4)
原来使用这种方法调用函数时,传入函数内的dest实际上是原dest的首地址,并不是dest这个数组,换句话说,传进去的是指向dest数组的指针,这样当然无法获得dest数组的正确大小。

当你定义一个数组的时候:

int a []= {1,2,3}; //   实际上被编译为int a[3] = {1,2,3} 

数组名代表的是数组的地址

注意 —— 你绝对没有办法通过数组名动态获得数组的大小。当你丢失a的长度信息的时候,你永远不可能知道他的长度。

当时,我被绕进去了,总以为能通过指针名获取到动态数组大小,现在想想还真是不扎实!

那么 sizeof 是怎么回事呢?他不是通过 a 的名字获得 a的大小了么? —— 大错特错!

关键字 sizeof 产生的是一个编译期常量(注1) 他的运作方式是这样的:

当你写:
sizeof a
实质是:
sizeof ( a的类型 )

而a的类型是什么呢?编译器察看 a的定义发现, 是 int [3]
就是说,这里 sizeof a 实质是:
sizeof ( int[3] )
完全等同于常量 12 (假定int为4字节)。

考虑一个函数
void func( int a[] );
//写成 int a[3] 也不会有本质区别——也许你该试试写成 int (&a) [3] ?

C++规定,数组作为形参的时候,a代表数组首地址
他的底层意义是: a 退化为了一个4字节的指针(32位,64位=8个字节的指针),没有任何变量表示数组的大小会“自动”被传递进来。

我们看看这个时候 sizeof a是什么:
sizeof( 函数形参的a[] ) = sizeof( int* const ) = 4 // 当然a[]不是合法的C++类型

因此,因此,此处的sizeof(dest)等同于上面的sizeof(a[])
所以,要在传递数组前,将该数组的长度算出来,然后一并作为参数传过来。

修改代码如下:

//size代表数组的大小
void MainWindow::multPacket(int dest[], int size)
{
   // int member=sizeof(dest)/sizeof(int);//表示成員個數
 //   qInfo()<<sizeof(dest)<<endl;
//    qInfo()<<sizeof(int)<<endl;
    for(int i=0;i<size;i++)
    {
        qInfo()<<dest[i];

    }
}

在调用函数之前,就将dest的size算出来,然后传进来就行了!

参考于:
https://blog.csdn.net/jimmy1357/article/details/16902583
https://www.cnblogs.com/lzy-1023/p/9372478.html

相关文章:

  • Android SDk Manager里面到底哪些东西是必须下载的?
  • C++11中的原子操作(atomic operation)
  • Android各版本代号/版本号/API级别
  • android 如何让通知不被清除或者点击后不消失
  • Linux-pthread如何设置线程的优先级
  • Qt系列文章之一(Qt 下载、安装,组件管理软件​储存库设置,离线/在线安装方式)
  • Qt系列文章之二(Qt 环境搭建,主要针对MSVC/Android 平台)
  • Qt系列文章之三(编写简单程序Hello world 到不同平台winPc/Android)
  • Qt系列文章之四(如何在visual Studio 里使用Qt)
  • Qt系列文章之五(QtCreator 里使用Qt 技巧)
  • Qt系列文章之六(Qt 元对象系统介绍)
  • Qt系列文章之七(Qt 属性系统介绍)
  • Qt系列文章之八(Qt 信号和槽使用)
  • Qt系列文章之九(Qt 数据类型介绍以及迭代器使用上)
  • Qt系列文章之十(Qt 数据类型介绍以及迭代器使用下)
  • (十五)java多线程之并发集合ArrayBlockingQueue
  • 2018以太坊智能合约编程语言solidity的最佳IDEs
  • 5、React组件事件详解
  • Brief introduction of how to 'Call, Apply and Bind'
  • C++回声服务器_9-epoll边缘触发模式版本服务器
  • Effective Java 笔记(一)
  • Electron入门介绍
  • in typeof instanceof ===这些运算符有什么作用
  • JS 面试题总结
  • Logstash 参考指南(目录)
  • PHP那些事儿
  • web标准化(下)
  • 关于使用markdown的方法(引自CSDN教程)
  • 官方新出的 Kotlin 扩展库 KTX,到底帮你干了什么?
  • 看完九篇字体系列的文章,你还觉得我是在说字体?
  • 七牛云 DV OV EV SSL 证书上线,限时折扣低至 6.75 折!
  • 如何设计一个比特币钱包服务
  • 如何在 Tornado 中实现 Middleware
  • 问题之ssh中Host key verification failed的解决
  • 云栖大讲堂Java基础入门(三)- 阿里巴巴Java开发手册介绍
  • ionic入门之数据绑定显示-1
  • 如何正确理解,内页权重高于首页?
  • ​Linux Ubuntu环境下使用docker构建spark运行环境(超级详细)
  • ​比特币大跌的 2 个原因
  • # Swust 12th acm 邀请赛# [ E ] 01 String [题解]
  • #NOIP 2014#Day.2 T3 解方程
  • (ibm)Java 语言的 XPath API
  • (附源码)spring boot公选课在线选课系统 毕业设计 142011
  • (附源码)springboot车辆管理系统 毕业设计 031034
  • (附源码)springboot炼糖厂地磅全自动控制系统 毕业设计 341357
  • (附源码)计算机毕业设计SSM智能化管理的仓库管理
  • (四)TensorRT | 基于 GPU 端的 Python 推理
  • (学习日记)2024.03.12:UCOSIII第十四节:时基列表
  • ./configure、make、make install 命令
  • .bat批处理(八):各种形式的变量%0、%i、%%i、var、%var%、!var!的含义和区别
  • .jks文件(JAVA KeyStore)
  • .NET C#版本和.NET版本以及VS版本的对应关系
  • .NET Core跨平台微服务学习资源
  • .net mvc 获取url中controller和action
  • .Net Redis的秒杀Dome和异步执行