认识 sizeof 操作符的基本特点以及使用方法

sizeof 用于计算一个变量或者类型所占用的空间大小,单位是字节


        目录

1、sizeof 的使用方法

2、sizeof 的基本特性

3、区分sizeof 和 strlen

(1) 语法角度

(2) 使用角度

4、sizeof 计算数组大小的坑


1、sizeof 的使用方法

语法:

  • sizeof 变量名
  • sizeof(变量名)
int main() {
	int a = 10;
	char b = 'x';
	int arr[10] = { 1 , 2 , 3 };

	printf("%d\n", sizeof a);    // 4
	printf("%d\n", sizeof(b));   // 1
	printf("%d\n", sizeof(arr));    //40

    /*
       变量a是 int 类型,一个int类型占 4 个字节,所以占用空间大小是 4 字节 
       变量b是char类型,一个char类型占 1 个字节,所以占用空间大小是 1 字节
    */

	return 0;
}

注意:数组arr的大小是10,相当于占了10个int类型的空间,你或许会认为,数组里只存了 3 个数,为什么占用空间大小不是 3*4 = 12 字节?

这个数组申请了10个位置,这10个位置就属于这个数组,跟数组里有多少内容没有任何关系,就好比买了3张电影票,电影院就有3个位置是自己的,你可以去一个人,也可以去三个人。

2、sizeof 的基本特性

下面大致总结了sizeof 的三个特性,其中两个已经在上面说过了

  • sizeof 是操作符,不是函数
  • sizeof 计算的是变量所占空间大小,跟这块空间使用了多少,没有关系
  • sizeof 内部的表达式不参与运算(如下)
int main()
{
    int a = 5;
    short s = 3;
    printf("字节大小:%d\n", sizeof(s = a + 2));    //2
    printf("s的值:%d\n", s);    //3

    return 0;

看起来像是:a + 2 的值是int类型,赋值给变量 s 的时候,因为变量 s 是 short类型,会被截短,

因此最终计算的是 s 的大小。

就结果而言是没有问题的,sizeof 确实计算的是 变量s 所占的空间大小,但是这个过程并没有发生加法运算,加法运算被无视了

3、区分sizeof 和 strlen

(1) 语法角度

sizeof 是操作符,而strlen 是函数

(2) 使用角度

sizeof 计算的是变量或者类型所占用的的空间大小,而strlen计算的是 有效长度(也就是数组中元素的个数)

#include <stdio.h>
#include <string.h>

int main()
{
    char arr[10] = { 1,2,3 };
    printf("字节大小:%d\n", sizeof(arr));    //10
    printf("数组有效长度:%d\n", strlen(arr));    //3

    return 0;
}

注意:strlen函数遇到 '\0' 的时候,会停止计算元素个数。但是上述数组中并未看到 '\0',那是因为

数组会自动将剩余部分初始化为 '\0'

4、sizeof 计算数组大小的坑

如果将数组 arr 单独放在 sizeof 中,那么 sizeof(arr) 计算的就是整个数组的大小;

如果将数组 arr 以实参的形式传递给其他函数,那么 sizeof(arr) 计算的是数组首元素地址的大小

void test(char arr[]){
    printf("%d\n", sizeof(arr));    //4/8 (32位环境下是4,64位环境下是8)
}

int main(){
    char arr[10] = {0};
    printf("%d\n", sizeof(arr));    //10
    test(arr);    
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值