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

C语言 sizeof 的介绍,以及sizeof计算数组名、 数组首地址、数组的元素之间的区别

一、sizeof 介绍

sizeof 是 C 语言中的一个运算符,用于计算数据类型或变量在内存中占用的字节数。用于计算数据类型或变量所占的内存大小,以字节为单位。它可以在编译时计算其操作数的大小,并返回一个 size_t 类型的值。它可以帮助了解不同类型的数据在内存中的布局,从而更有效地管理内存。

代码示例:

#include <stdio.h>  int main(void) 
{  int a = 10;  float b = 5.75;  char c = 'A';  double d = 9.99;  printf("Size of int: %zu bytes\n", sizeof(int));  printf("Size of float: %zu bytes\n", sizeof(float));  printf("Size of char: %zu bytes\n", sizeof(char));  printf("Size of double: %zu bytes\n", sizeof(double));  printf("Size of variable a: %zu bytes\n", sizeof(a));  printf("Size of variable b: %zu bytes\n", sizeof(b));  printf("Size of variable c: %zu bytes\n", sizeof(c));  printf("Size of variable d: %zu bytes\n", sizeof(d));  // 使用表达式  printf("Size of expression a + b: %zu bytes\n", sizeof(a + b)); // 结果为 float 类型大小  return 0;  
}

测试结果输出(可能因编译器和平台而异):
在这里插入图片描述

数组和结构体示例代码:

#include <stdio.h>  struct Example 
{  char c;  int i;  double d;  
};  int main(void) 
{  int arr[10];  struct Example ex;  printf("Size of array arr: %zu bytes\n", sizeof(arr)); // 10 * sizeof(int)  printf("Number of elements in array arr: %zu\n", sizeof(arr) / sizeof(arr[0]));  printf("Size of struct Example: %zu bytes\n", sizeof(ex));  return 0;  
}

示例运行结果:
在这里插入图片描述

注意事项
1、编译时计算:sizeof 是在编译时计算的,而不是运行时。因此,它不会增加程序的运行时间开销。
2、类型大小:不同编译器和平台可能会因为对齐和填充的原因,导致相同类型的数据大小不同。例如,在 32 位系统上,int 通常是 4 字节,但在某些 16 位系统上可能是 2 字节。
3、数组大小:使用 sizeof 可以方便地计算数组的总大小。例如,sizeof(array) / sizeof(array[0]) 可以计算数组的元素个数。
4、结构体:对于结构体,sizeof 会计算所有成员的大小,并考虑对齐和填充。

二、sizeof计算数组名、 数组首地址、数组的元素

对于数组来说,sizeof 的使用有一些特殊的行为,特别是当它与数组的首地址和数组的第一个元素进行比较时。

2.1 sizeof 数组名

当对数组名使用 sizeof 操作符时,它会返回整个数组所占的内存大小。例如:

int arr[10];  
printf("%d\n", sizeof(arr));  // 输出 40,假设 int 大小为 4 字节

在这个例子中,sizeof(arr) 返回的是整个数组 arr 的大小,即 10 * 4 = 40 字节。

2.2 sizeof 数组首地址(或数组名作为指针)

在C语言中,数组名在大多数表达式中为指向数组第一个元素的指针。当对数组名(作为指针)使用 sizeof 时,它实际上计算的是指针的大小,而不是数组的大小。例如:

int arr[10];  
printf("%d\n", sizeof(&arr));  // 输出 指针大小,通常是 4 或 8 字节,取决于平台  
printf("%d\n", sizeof(&arr[0]));  // 同样输出 指针大小

在这个例子中,sizeof(&arr) 和 sizeof(&arr[0]) 都是计算指针的大小,而不是数组的大小。&arr 是指向整个数组的指针(类型为 int ( * )[10]),但在这里它作为 void * 或其他指针类型传递给 sizeof,所以结果是指针的大小。而 &arr[0] 是指向数组第一个元素的指针(类型为 int* ),结果同样是指针的大小。

2.3 sizeof 数组的某个元素

当对数组的某个元素使用 sizeof 时,它返回的是该元素的大小。例如:

int arr[10];  
printf("%d\n", sizeof(arr[0]));  // 输出 4,假设 int 大小为 4 字节

在这个例子中,sizeof(arr[0]) 返回的是数组第一个元素(也是第0个元素)的大小,即 4 字节。
测试代码:

#include <stdio.h>int main(void)
{static unsigned char pre_status[3]={0};printf("sizeof(pre_status)=%ld \n",sizeof(pre_status));printf("sizeof(&pre_status)=%ld \n",sizeof(&pre_status));printf("sizeof(&pre_status[0])=%ld \n",sizeof(&pre_status[0]));printf("sizeof(pre_status[0]=%ld \n",sizeof(pre_status[0]));printf("sizeof(pre_status)/sizeof(pre_status[0]) = %ld \n",sizeof(pre_status)/sizeof(pre_status[0]));return 0;
}

测试结果:

在这里插入图片描述

总结:
1、sizeof(数组名) 返回整个数组的大小。
2、sizeof(&数组名) 或 sizeof(&数组名[0]) 返回指针的大小。
3、sizeof(数组名[0]) 返回数组第一个元素的大小。

相关文章:

C语言 sizeof 的介绍,以及sizeof计算数组名、 数组首地址、数组的元素之间的区别

一、sizeof 介绍 sizeof 是 C 语言中的一个运算符&#xff0c;用于计算数据类型或变量在内存中占用的字节数。用于计算数据类型或变量所占的内存大小&#xff0c;以字节为单位。它可以在编译时计算其操作数的大小&#xff0c;并返回一个 size_t 类型的值。它可以帮助了解不同类…...

深入理解Oracle闪回技术

引言&#xff1a; Oracle 闪回&#xff08;Flashback&#xff09;是一组强大的功能&#xff0c;用于恢复数据库中的数据或对象到过去的某个时间点或状态&#xff0c;而无需进行传统的基于备份和恢复的操作。 Oracle 闪回的主要类型 1. 闪回查询&#xff08;Flashback Query&…...

Go 语言初探

Google 公司有一个传统,允许员工利用 20% 的工作时间开发自己的实验项目。2007 年 9月,UTF-8 的设计者之一 Rob Pike(罗布.皮克)在 Google 的分布式编译平台上进行 C++ 编译时,与同事 Robert Griesemer (罗布.格里泽默)在漫长的等待中讨论了编程语言面临的主要问题。他们一…...

使用ROS资源编排一键部署LNMP建站环境,手动整理教程

LNMP是目前主流的网站服务器架构之一&#xff0c;适合运行大型和高并发的网站应用&#xff0c;例如电子商务网站、社交网络、内容管理系统等。LNMP分别代表Linux、Nginx、MySQL和PHP。本文阿里云服务器网aliyunfuwuqi.com介绍如何使用阿里云资源编排服务&#xff08;ROS&#x…...

猎板PCB镍钯金工艺你了解多少?

PCB镍钯金工艺&#xff0c;也称为ENEPIG&#xff08;Electroless Nickel Electroless PALLADIum Gold&#xff09;工艺&#xff0c;是一种在PCB表面处理中使用的先进工艺。这种工艺通过在PCB线路板上形成一层镍钯合金层&#xff0c;有效地提高了线路板的耐氧化性、耐腐蚀性和可…...

热更新解决方案2 —— Lua语法相关知识点

概述 开发环境搭建 Lua语法 1.第一个Lua程序 2.变量 print("******变量*******"); --lua当中的简单变量类型 -- nil number string boolean -- lua 中所有的变量声明 都不需要声明变量类型 它会自动的判断类型 -- 类似C# 中的var --lua中的一个变量 可以随便赋值 ——…...

【c++ arx选项板】

static void xlArx_gmenu(void) {if (!g_pPaletteSetEx){g_pPaletteSetEx=CTunnelSectionPaletteSetEx::Instance(...

新时代下吉林省城乡流动人才就业问题及路径探析

摘要&#xff1a;新时代背景下&#xff0c;中国经济快速发展&#xff0c;城乡融合发展成为缩小城乡差距&#xff0c;推动共同富裕的重要方式。吉林省作为东北老工业基地&#xff0c;传统产业竞争优势减弱&#xff0c;城乡流动人才就业规模增加&#xff0c;并呈现“农村-城市”的…...

Go 1.19.4 命令调用、日志、包管理、反射-Day 17

1. 系统命令调用 所谓的命令调用&#xff0c;就是通过os&#xff0c;找到系统中编译好的可执行文件&#xff0c;然后加载到内存中&#xff0c;变成进程。 1.1 exec.LookPath&#xff08;寻找命令&#xff09; 作用&#xff1a; exec.LookPath 函数用于在系统的环境变量中搜索可…...

Unity 2d UI 实时跟随场景3d物体

2d UI 实时跟随场景3d物体位置&#xff0c;显示 3d 物体头顶信息&#xff0c;看起来像是场景中的3dUI&#xff0c;实质是2d UIusing System.Collections; using System.Collections.Generic; using UnityEngine; using DG.Tweening; using UnityEngine.UI; /// <summary>…...

全方面熟悉Maven项目管理工具(二)坐标、pom.xml文件的解读!

1. 坐标&#xff08;核心概念&#xff09; 1.1 数学中的坐标 使用 x、y、z 三个向量作为空间的坐标系&#xff0c;可以在空间中唯一的定位到一个点 1.2 Maven 中的坐标 1.2.1 向量说明&#xff1a; 使用三个向量在 Maven的仓库 中唯一的定位到一个 jar 包 groupId&#xf…...

php常用设计模式之单例模式

设计模式是我们日常开发中最常用的编程模式之一&#xff0c;也是面试中最高频的考点之一。通过合理运用设计模式&#xff0c;可以使代码结构更加清晰、易于维护。通过这篇文章 我也讲一下设计模式中的单例模式&#xff0c;了解下它的原理和适用场景。 单例模式 单例模式&…...

一文搞懂Android主题和样式

1. 概念与作用 1.1 定义与组成 Android Theme是用于定义应用程序或其部分的视觉和界面风格的一种资源。主题在Android中扮演着重要的角色&#xff0c;它们允许开发者统一和自定义应用的外观和感觉。一个主题定义了一组属性集合&#xff0c;这些属性可以是颜色、字体、控件样式…...

360与重庆科技大学战略携手,为数字中国建设输送实战人才

近日&#xff0c;360数字安全集团与重庆科技大学正式签订了战略合作协议&#xff0c;双方将围绕创新人才培养、科研技术攻关、专业实验室共建、车联网安全以及社会服务等多个维度展开深度合作&#xff0c;共同打造数字安全人才培养新高地&#xff0c;为数字重庆的建设与发展注入…...

基于异常合成的图像异常检测方法

基于异常合成的图像异常检测方法 基于异常合成思路实现图像异常检测的方法&#xff0c;它们的核心思路是&#xff1a; 试图通过合成异常样本穷尽所有可能出现的异常类型&#xff0c;从而将无监督的异常检测&#xff08;one class classification&#xff09;建模为一个全监督…...

机器学习方向在算法优化上有哪些创新点?

以下是机器学习算法优化方面的一些创新点: 一、优化算法自身的改进 随机梯度下降(SGD)的变体 Adagrad 传统的随机梯度下降算法使用固定的学习率,而Adagrad根据每个参数的历史梯度信息自适应地调整学习率。对于稀疏数据,它可以为不同的参数分配不同的学习率,使得频繁出现…...

基于yolov8的道路交通事故检测系统python源码+onnx模型+评估指标曲线+精美GUI界面

【算法介绍】 基于YOLOV8的道路交通事故检测系统是一种先进的智能交通监控解决方案&#xff0c;它利用YOLOV8这一前沿的目标检测算法&#xff0c;实现对交通事故的高效、实时检测。 该系统结合了自定义的道路交通事故数据集&#xff0c;对YOLOV8模型进行了针对性的训练与优化…...

HttpUtils 详解

一、详解 1.1 介绍 现如今的 Web 项目&#xff0c;由服务端向外发起网络请求的场景&#xff0c;基本上随处可见&#xff01; 传统情况下&#xff0c;在服务端代码里访问 http 服务时&#xff0c;一般会使用 JDK 的 HttpURLConnection 或者 Apache 的 HttpClient&#xff0c;不…...

云计算第四阶段: cloud二周目 07-08

cloud 07 一、k8s服务管理 创建服务 # 资源清单文件 [rootmaster ~]# kubectl create service clusterip websvc --tcp80:80 --dry-runclient -o yaml [rootmaster ~]# vim websvc.yaml --- kind: Service apiVersion: v1 metadata:name: websvc spec:type: ClusterIPselector…...

智能合约开发工具Remix

不久前&#xff0c;我在B站、视频号和 YouTube 都陆续发布了新的一套免费视频课程《智能合约开发工具Remix》&#xff0c;总共分为了 9 个小节的视频&#xff0c;以下分别是这 9 个小节在 B 站的视频链接&#xff0c;喜欢直接看视频的伙伴可以去 B 站观看&#xff1a; 概况文件…...

Linux链表操作全解析

Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表&#xff1f;1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...

应用升级/灾备测试时使用guarantee 闪回点迅速回退

1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间&#xff0c; 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点&#xff0c;不需要开启数据库闪回。…...

2023赣州旅游投资集团

单选题 1.“不登高山&#xff0c;不知天之高也&#xff1b;不临深溪&#xff0c;不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...

基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解

JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用&#xff0c;结合SQLite数据库实现联系人管理功能&#xff0c;并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能&#xff0c;同时可以最小化到系统…...

Caliper 配置文件解析:fisco-bcos.json

config.yaml 文件 config.yaml 是 Caliper 的主配置文件,通常包含以下内容: test:name: fisco-bcos-test # 测试名称description: Performance test of FISCO-BCOS # 测试描述workers:type: local # 工作进程类型number: 5 # 工作进程数量monitor:type: - docker- pro…...

【堆垛策略】设计方法

堆垛策略的设计是积木堆叠系统的核心&#xff0c;直接影响堆叠的稳定性、效率和容错能力。以下是分层次的堆垛策略设计方法&#xff0c;涵盖基础规则、优化算法和容错机制&#xff1a; 1. 基础堆垛规则 (1) 物理稳定性优先 重心原则&#xff1a; 大尺寸/重量积木在下&#xf…...

2.3 物理层设备

在这个视频中&#xff0c;我们要学习工作在物理层的两种网络设备&#xff0c;分别是中继器和集线器。首先来看中继器。在计算机网络中两个节点之间&#xff0c;需要通过物理传输媒体或者说物理传输介质进行连接。像同轴电缆、双绞线就是典型的传输介质&#xff0c;假设A节点要给…...

算法—栈系列

一&#xff1a;删除字符串中的所有相邻重复项 class Solution { public:string removeDuplicates(string s) {stack<char> st;for(int i 0; i < s.size(); i){char target s[i];if(!st.empty() && target st.top())st.pop();elsest.push(s[i]);}string ret…...

ArcGIS Pro+ArcGIS给你的地图加上北回归线!

今天来看ArcGIS Pro和ArcGIS中如何给制作的中国地图或者其他大范围地图加上北回归线。 我们将在ArcGIS Pro和ArcGIS中一同介绍。 1 ArcGIS Pro中设置北回归线 1、在ArcGIS Pro中初步设置好经纬格网等&#xff0c;设置经线、纬线都以10间隔显示。 2、需要插入背会归线&#xf…...

【1】跨越技术栈鸿沟:字节跳动开源TRAE AI编程IDE的实战体验

2024年初&#xff0c;人工智能编程工具领域发生了一次静默的变革。当字节跳动宣布退出其TRAE项目&#xff08;一款融合大型语言模型能力的云端AI编程IDE&#xff09;时&#xff0c;技术社区曾短暂叹息。然而这一退场并非终点——通过开源社区的接力&#xff0c;TRAE在WayToAGI等…...