C++中对数组名使用sizeof和对指针使用sizeof结果为何不同

数组名的sizeof计算整个数组字节大小,而指针的sizeof仅返回指针本身大小,因数组名在非形参上下文中代表整个数组对象,指针则为地址变量。

c++中对数组名使用sizeof和对指针使用sizeof结果为何不同

在C++中,对数组名使用

sizeof

和对指针使用

sizeof

结果不同,是因为它们的类型和含义本质不同。

数组名的sizeof:计算整个数组的字节大小

当在函数内部或全局作用域中对数组名使用

sizeof

时,它代表的是整个数组对象。编译器知道数组的类型和元素个数,因此可以计算出总字节数。

例如:

int arr[5] = {1, 2, 3, 4, 5};std::cout << sizeof(arr) << std::endl; // 输出 20(假设int为4字节)

这里

arr

是长度为5的

int

数组,每个

int

占4字节,总共20字节。

sizeof(arr)

返回的是整个数组在内存中占用的空间。

立即学习“C++免费学习笔记(深入)”;

指针的sizeof:只返回指针本身的大小

指针变量本身是一个存储地址的变量,其大小与系统架构有关(如32位系统通常为4字节,64位系统为8字节),与它指向的数据无关。

例如:

int* ptr = arr;std::cout << sizeof(ptr) << std::endl; // 输出 8(64位系统)

这里

ptr

是一个指向

int

的指针,

sizeof(ptr)

只返回指针本身的大小,不是它可能指向的数组的大小。

数组退化为指针的常见陷阱

当数组作为参数传递给函数时,它会“退化”为指向首元素的指针。此时在函数内部使用

sizeof

,得到的是指针大小,而不是数组大小。

例如:

void func(int arr[]) {    std::cout << sizeof(arr) << std::endl; // 输出 8(64位系统),不是数组总大小}

尽管参数写成

int arr[]

,但编译器实际将其视为

int* arr

。所以

sizeof(arr)

等价于

sizeof(int*)

要获得数组真实大小,应在数组作用域内使用

sizeof(arr)/sizeof(arr[0])

,或显式传递大小参数。

基本上就这些。关键在于区分数组名在不同上下文中的类型:作为数组对象时代表整个内存块,作为参数或被赋给指针时就只是地址。

以上就是C++中对数组名使用sizeof和对指针使用sizeof结果为何不同的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1474646.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月18日 21:45:38
下一篇 2025年12月18日 21:45:52

相关推荐

  • C++如何在模板函数中使用auto和decltype

    使用auto和decltype可推导模板函数返回类型;2. auto结合尾置返回类型→decltype(expression)自动推导复杂表达式类型;3. decltype能精确获取表达式或变量类型,支持引用类型推导;4. 在泛型编程中,配合std::forward实现完美转发,保持参数左右值属性。…

    2025年12月18日
    000
  • C++基于范围的for循环与多维数组遍历

    C++中基于范围的for循环通过嵌套结构和引用处理多维数组,避免数组退化为指针,确保编译器正确推断范围,但要求数组大小在编译时已知,动态数组需用传统循环或std::vector替代。 基于范围的for循环(Range-based for loop)在C++中简化了容器和数组的遍历。它能优雅地处理一维…

    2025年12月18日
    000
  • C++如何使用constexpr实现编译期计算

    constexpr关键字用于声明编译期可求值的常量表达式,支持变量、函数和构造函数;示例中square、factorial函数在编译时计算结果;C++14起constexpr函数支持循环和局部变量;可结合模板实现通用编译期计算如power函数;编译期结果可用于数组大小和模板参数,提升性能与类型安全。…

    2025年12月18日
    000
  • C++文件历史记录 最近使用文件管理

    使用std::list存储最近文件路径,添加时移除重复项并插入头部,限制数量后保存至文件。 在C++开发中,实现“最近使用文件”(Most Recently Used, MRU)功能是提升用户体验的常见需求。这类功能通常用于保存用户最近打开过的文件路径,程序启动时可快速访问。下面介绍一种简单实用的管…

    2025年12月18日
    000
  • C++异常与RAII资源管理结合使用方法

    RAII通过对象的构造和析构自动管理资源,确保异常发生时资源正确释放。1. 异常会中断执行流程,导致裸资源泄漏;2. RAII将资源绑定到对象生命周期,栈展开时自动调用析构函数;3. 标准类如std::unique_ptr、std::lock_guard实现自动内存和锁管理;4. 自定义RAII类可…

    2025年12月18日
    000
  • 如何安全地使用C++指针来避免悬挂指针和野指针问题

    初始化指针为nullptr避免野指针;2. 释放内存后立即将指针置空防止悬挂指针;3. 优先使用智能指针如unique_ptr和shared_ptr自动管理内存;4. 禁止返回局部变量地址。 在C++中,指针是强大但容易出错的工具。悬挂指针和野指针是常见的内存错误,可能导致程序崩溃或不可预测的行为。…

    2025年12月18日
    000
  • C++虚函数开销 使用CRTP静态多态替代

    使用CRTP可消除虚函数运行时开销。虚函数因vtable间接调用、内存开销和阻碍优化导致性能损耗,而CRTP通过模板在编译期确定调用目标,实现静态多态,避免vtable机制,允许函数内联,提升性能。适用于性能敏感且类型在编译期已知的场景,但牺牲运行时多态能力,增加代码体积,调试复杂。需根据需求权衡选…

    2025年12月18日
    000
  • C++auto类型推导与函数返回值结合

    auto作为函数返回类型可由编译器推导,提升泛型编程灵活性,但需注意类型精确性与可读性平衡,多用于复杂类型,简单类型应显式声明以增强可读性。 C++中的 auto 类型推导与函数返回值结合,简而言之,就是允许编译器根据函数 return 语句的表达式自动确定函数的返回类型。这不仅仅是少敲几个字那么简…

    2025年12月18日
    000
  • C++如何使用模板实现对象池设计模式

    对象池通过预分配和重用对象,减少频繁创建销毁带来的内存开销与碎片化,提升性能。 C++中使用模板实现对象池设计模式,本质上是创建了一个通用的机制,能够预先分配并管理任意类型的对象实例,从而在需要时快速提供可用对象,并在使用完毕后回收重用,而不是频繁地创建和销毁。这对于那些创建开销大、生命周期短且数量…

    2025年12月18日
    000
  • C++如何使用范围for循环遍历容器

    范围for循环通过语法糖简化容器遍历,提升代码安全与可读性,适用于提供begin/end的容器,推荐使用const auto&避免拷贝,但需避免修改容器结构、注意索引需求及生命周期问题,特定场景应选用传统迭代器或C++20视图替代。 在C++中,使用范围for循环(range-based f…

    2025年12月18日
    000
  • C++智能指针在性能优化中的使用技巧

    答案:智能指针性能优化需根据所有权模型选择类型,优先使用std::unique_ptr避免开销,std::shared_ptr注意引用计数成本,合理使用make系列函数和weak_ptr,减少拷贝与控制块开销,结合场景权衡安全与效率。 智能指针在C++中是管理动态内存的现代手段,不仅能有效避免内存泄…

    2025年12月18日
    000
  • C++如何使用内存池优化对象频繁分配

    内存池通过预分配大块内存并管理对象的分配与回收,减少系统调用和碎片化,提升性能。示例中使用模板实现固定类型的对象池,分配时从内存块中取出节点,释放时将对象放回空闲链表,适用于短生命周期对象如游戏子弹或网络包。需注意类型固定、线程安全、显式析构等问题,合理设计可显著优化频繁创建销毁对象的场景。 在C+…

    2025年12月18日
    000
  • C++如何优化模板函数减少编译和运行开销

    关键在于控制模板实例化以减少编译膨胀和提升性能。应显式实例化常用类型、使用C++20 concepts限制参数类型,并将非泛型逻辑分离为普通函数;通过迭代器降低实例化组合数,必要时用运行时多态替代模板;采用pimpl隐藏实现细节,结合显式实例化减少头文件依赖;优化运行时性能需启用内联、避免深度递归并…

    2025年12月18日
    000
  • C++如何在文件写入中使用格式化输出

    使用fstream和iomanip实现C++文件格式化输出,通过ofstream结合setw、setprecision等操作符控制写入格式,如同cout般灵活进行小数位数、对齐、进制等设置。 在C++中进行文件写入时,如果需要使用格式化输出(比如控制小数位数、对齐方式、进制等),推荐使用 fstre…

    2025年12月18日
    000
  • C++如何使用数组存储和访问数据

    数组是C++中用于存储相同类型多个元素的基础数据结构,适用于元素数量固定的情况;声明时需指定类型、名称和大小,大小为常量表达式,如int arr[5]; 可在声明时初始化,如double scores[3] = {95.5, 87.2, 90.0}; 字符数组如char str[6] = &#822…

    2025年12月18日
    000
  • C++异常日志记录 错误信息追踪方法

    使用try-catch捕获异常并记录日志,结合自定义异常类添加文件、行号、函数名等上下文信息,通过宏自动注入位置,集成spdlog等日志库实现分级异步输出,辅以断言和错误码记录关键函数执行状态,建立统一错误处理规范,确保日志清晰结构化,便于问题追踪分析。 在C++开发中,异常和错误的追踪是保障程序稳…

    2025年12月18日
    000
  • C++如何处理异常中的指针和引用问题

    合理使用智能指针、避免悬空引用、按值抛出异常并依赖RAII可确保C++异常安全。 在C++中处理异常时,指针和引用的使用需要格外小心,因为异常可能在任何时候被抛出,导致资源泄漏或悬空引用。关键在于确保资源的正确释放和对象生命周期的合理管理。 使用智能指针避免内存泄漏 原始指针对异常不友好,一旦在分配…

    2025年12月18日
    000
  • C++STL算法merge和inplace_merge使用技巧

    merge用于合并两个有序区间到新空间,inplace_merge则原地合并同一容器内两个连续有序段;前者需额外存储空间,后者在原容器操作,适用于归并排序的合并阶段,二者均要求输入有序,时间复杂度为O(N+M),合理使用可提升效率。 在C++标准模板库(STL)中,merge 和 inplace_m…

    2025年12月18日
    000
  • C++模板显式实例化 控制代码生成方法

    显式实例化是程序员明确指定模板和类型以强制生成代码,避免重复编译。它通过template class MyTemplate;语法实现,适用于类、函数及成员函数模板,常用于常用或大型模板以提升编译效率。与隐式实例化由使用触发不同,显式实例化集中控制代码生成位置,配合extern template可抑制…

    2025年12月18日
    000
  • C++如何处理复合对象的生命周期管理

    智能指针的核心作用是实现RAII和明确所有权,其中unique_ptr确保独占所有权,shared_ptr通过引用计数实现共享所有权,weak_ptr打破循环引用,共同保障复合对象生命周期的安全管理。 C++中处理复合对象的生命周期管理,说到底,就是确保资源(尤其是内存)在需要时被正确分配,在不再需…

    2025年12月18日
    000

发表回复

登录后才能评论
关注微信