C语言之sizeof详解,5点透析,帮你真正了解它

本文介绍了C语言中的sizeof关键字,强调了它不是函数,以及它在计算内存大小、与strlen的区别、返回值类型、运算规则和在结构体中的应用。作者通过实例详细讲解了sizeof的关键概念。
摘要由CSDN通过智能技术生成

今天也要继续坚持

前言

今天复习C语言了解到不少和她有关的知识,才知道之前对他了解甚少,于是写下博客及时记录自己的所得,与大家分享一下

第一点:sizeof不是函数

sizeof是一个关键字而不是函数!是的,他不是函数!!!

原因很简单,函数在调用时后面都会加一个(),这个叫函数调用操作符,但是sizeof在后面接变量时是可以不带括号的


	int a = 10;
	sizeof a;
	sizeof(a);

第二点:sizeof是求得什么

sizeof的作用是求后面东西所占内存的大小,

非也非也,当操作数是变量时它计算的是变量所占内存空间的大小,但当操作数是一个类型时,他所求的是该类型创建一个变量所占内存大小,例如:

	int a = 10;
	sizeof a;
	sizeof(a);
	sizeof(int);

这三个值都是4.

但是要注意,后面跟的是类型时必须加括号。

第三点:sizeof与strlen

谈到求大小自然想到了库函数strlen,ok那我们好好比较一下二位。

strlen:

仅限于在字符数组,字符串中使用,他的原理是从首元素开始,向后找,找到’\

‘\0'为止,然后计算二者之间的元素个数,因此可能发生数组越界。

sizeof:

当操作数是变量时它计算的是变量所占内存空间的大小,但当操作数是一个类型时,他所求的是该类型创建一个变量所占内存大小,单位是字节,不会发生数组越界。他只会关注占用多少空间,至于空间方什么他不在乎。

第四点:sizeof返回值

C语言本身没有规定他的返回值是什么类型,而是留给系统自己决定,可能是unsigned int,unsigned long,unsigned long long,所以C语言创建了一个类型别名,size_t,统一表示其类型,这就增加了代码的可移植性。

ok知道了这个,我们来看一道题

#include<stdio.h>
int main()
{
	int a = 0;
	a--;
	if (a > sizeof(a))
		printf("大于");
	else if (a < sizeof(a))
		printf("小于");
}

你的答案是小于吗,

因为a是-1,二sizeof返回值是4

哈哈,恭喜答错了,

答案是小于,这是因为sizeof返回值是无符号数,二a是有符号数,因此而者进行比较时会发生类型转化,a变为unsigned int,自然就是大于了.

第五点:sizeof中的运算

在来看一道题

#include<stdio.h>
int main()
{
	short a = 1;
	int b = 2;
	printf("%d\n",sizeof(a = b + 1));
	printf("%d", b);
}

不卖关子了,答案是2   2。

原因是sizeof中的表达式不会发生运算,他在代码进行编译的时候就已经根据表达式的类型确定了返回值,二表达式的运算发生在程序运行期间,由于编译期间已经处理了sizeof,那表达式自然也就不会运算了。

5.关于sizeof后的操作数含有数组名

要知道数组名一般就认为是指针,但有两个特例,一个是&arr,另一个是sizeof(arr),此时他们代表了整个数组,例如:

#include<stdio.h>
int main()
{
	int arr[10] = { 0 };
	printf("%d", sizeof(arr));
}

结果是40

但如果里面数组名发生运算,例如:

#include<stdio.h>
int main()
{
	int arr[10] = { 0 };
	printf("%d", sizeof(arr+1));
}

则结果是8或4,此时arr被看作指针,在64位平台指针大小是8个字节,32为平台下是4个

第六点sizeof与结构体

关于这个涉及到对齐数与偏移量,比较复杂

我出了一篇博客专门探讨这个问题。就是下面这个链接

C语言中结构体的定义,变量的创建和初始化,相关的指针调用以及存在的内存对齐。-CSDN博客

ok那么如果觉得有用的话,就点个赞支持一下吧。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值