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

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]) 返回数组第一个元素的大小。


http://www.kler.cn/news/354652.html

相关文章:

  • 华为OD题库刷题记录1(掌握的单词个数+手机APP防沉迷+找朋友+流浪地球)
  • 小马识途海外媒体推广有何优势?
  • 关于核心技术工程化、产业化的思考
  • Django操作数据库
  • 几种HTTP请求参数的简单介绍
  • JavaSE之抽象类和接口
  • C++ OpenCV实现简单的自瞄脚本(OpenCV实战)
  • 永恒之蓝漏洞
  • 毕业设计之—基于ManTra-Net的图像篡改检测方法研究与应用实现
  • uni-app关闭底部系统导航栏的控制按钮BUG
  • SSTI模板注入+CTF实例
  • TS学习——type与interface的异同点
  • c++基础知识复习(1)
  • pdf删除几个页面怎么操作?PDF页面删除的快捷方法
  • Unity UGUI SuperScrollView介绍
  • ETL技术在金蝶云星空与旺店通WMS集成中的应用
  • 期货交易程序化,哪些API可供选择及如何使用?
  • taro小程序如何全局监听路由变化?
  • 基于SpringBoot+Vue+uniapp微信小程序的乡村政务服务系统的详细设计和实现(源码+lw+部署文档+讲解等)
  • AI学习指南深度学习篇-生成对抗网络的变体及扩展