C语言笔记:变量字节长度&取值范围——sizeof()VS strlen
来源:互联网 发布:酒店清洗床单 知乎 编辑:程序博客网 时间:2024/04/27 15:22
sizeof():是运算符(operator),其作用就是返回一个对象或者类型所占的内存字节数。可用于任何变量名、类型名或常量值,当用于变量名(不是数组名)或常量时,它不需要用圆括号。C规定sizeof返回size_t类型的值,是一个无符号整数类型,是根据标准类型定义的,与可移植类型(如int32_t)相同。在头文件stddef.h中定义,一般定义为typedef unsigned int size_t;
因此,语法格式 sizeof 有三种语法形式:
1) 用于数据类型
sizeof( type_name ); // sizeof( 类型 );
例:
sizeof(int); //求类型int的sizeof值
2) 用于变量
sizeof ( object ); // sizeof( 对象 );
例:
int a; //定义一个int类型的变量a
sizeof(a); //求a的sizeof值
3)用于常数值
sizeof object; // sizeof 对象;
例:
sizeof 6; //求6的sizeof值
sizeof计算对象的大小也就是转换成对对象类型的计算,因此同种类型的不同对象其sizeof值都是一致的。sizeof也可以对一个表达式求值,编译器根据表达式的最终结果类型来确定大小,而不是对表达式进行计算。
如:
1.sizeof( 6 ); // 常数6的类型为int,所以等价于 sizeof( int );
sizeof(8);// 常数6的类型为int,所以等价于 sizeof( int );
所以上面两个sizeof的值相等
2.sizeof( 4 + 13.14 ); // 4 + 13.14为17.14,17.14的类型为double,所以等价于 sizeof( double );
sizeof也可以对一个函数调用求值,其结果是函数返回类型的大小,函数并不会被调用。
例如:
int add(){ int a; int b; return a + b;}int main(){ size_t m = sizeof(add()); //m的值为函数add()的sizeof值 printf("%d\n",m); return 0;}3.基本数据类型的sizeof
下为求各种基本数据类型的sizeof值:
#include <stdio.h> int main(){ printf("sizeof (char) = %d\n",sizeof (char)); printf("sizeof (int) = %d\n",sizeof (int)); printf("sizeof (short) = %d\n",sizeof (short)); printf("sizeof (long) = %d\n",sizeof (long)); printf("sizeof (float) = %d\n",sizeof (float)); printf("sizeof (double) = %d\n",sizeof (double)); printf("sizeof (long long) = %d\n",sizeof (long long)); return 0;}
调试结果:
sizeof (char) = 1 sizeof (int) = 4 sizeof (short) = 2 sizeof (long) = 4 sizeof (float) = 4 sizeof (double) = 8 sizeof (long long) = 84.指针变量的sizeof
32位操作系统中任何指针的sizeof值为4字节,因为指针是用来存放地址的,即为计算机内部地址总线的宽度,32位操作系统为4字节,64位的操作系统中指针变量的sizeof值为8.
下面为求指针sizeof值的程序:
#include <stdio.h> #include <string.h> int main() { char *ptr = "Welcome to China!"; char *str = "See you tomorrow."; char *p = "Good night."; printf("sizeof (*ptr) = %d\n",sizeof (ptr)); printf("sizeof (*str) = %d\n",sizeof (str)); printf("sizeof (*p) = %d\n",sizeof (str)); return 0; }
调试结果:
sizeof (*ptr) = 4 sizeof (*str) = 4 sizeof (*p) = 45.数组的sizeof值
数组的sizeof值等于数组所占用的内存字节数
下面为求数组sizeof值的程序:
#include <stdio.h> int main(){ int a[100] = {0}; char b[100] = "Hello world!"; printf("sizeof (a) = %d\n",sizeof(a)); printf("sizeof (b) = %d\n",sizeof(b)); return 0;}调试结果:
sizeof (a) = 400 sizeof (b) = 100注意:两个数组的sizeof值不同是因为,数组类型不同,int的sizeof值为4,char的sizeof值为1.
6.结构体的sizeof值
通过下列程序理解一下:
#include <stdio.h> int main(){ struct stu { int age; char sex; }STU; struct class { char grade; int stu_num; }CLASS; printf("sizeof (STU) = %d\n",sizeof (STU)); printf("sizeof (CLASS) = %d\n",sizeof (CLASS)); return 0;}
调试结果:
sizeof (STU) = 8 sizeof (CLASS) = 8比较一下程序中的两个结构体变量,一个是int,char的顺序,一个是char,int的顺序,两个结构体的sizeof值却一样等于8。原来,结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节。
7.联合体的sizeof
例题为:
#include <stdio.h> int main(){ union stu { int age; char sex; }a; printf("sizeof (a) = %d\n",sizeof(a)); return 0;}调试结果为:
sizeof (a) = 4如果联合体中只有char型,那它的结果为1,如果只有int型,结果则为4.所以整个联合体的sizeof也就是每个成员sizeof的最大值。
注意:联合体和结构体的sizeof值的求法之所以不同,是因为结构体在内存组织上是顺序式的,联合体则是重叠式,各成员共享一段内存,所以。结构体的成员也可以是复合类型,这里复合类型成员是被作为整体考虑的。
注:1.sizeof只在编译时起作用,而不是运行时。
2.C99标准规定,函数、不能确定类型的表达式以及位域成员不能被计算sizeof值。
3.为了防止将sizeof误认为一个函数,在写程序的时候,sizeof和()间留一个空格,可以提醒自己sizeof是运算符。
strlen:是函数,其作用是计算给定字符串的长度,计算时,从内存的某一个位置开始扫描,直到扫描到结束符'\0'为止’’。返回值是它所计算的字符长度值,不包括'\0'.一般要包括string.h文件,格式为:unsigned int strlen (char *s);。
strlen的结果要在运行的时候才能计算出来,是用来计算字符串的长度,不是类型占内存的大小。
例题:
#include <stdio.h> #include <string.h>int main(){ char str[100] = "Hello world!"; printf("the lenght of str[100] = %d\n",strlen(str)); return 0;}调试结果为:
the lenght of str[100] = 12注:strlen() 函数计算的是字符串的实际长度,遇到第一个'\0'结束。如果你只定义没有给它赋初值,这个结果是不定的,它会从首地址一直找下去,直到遇到'\0'停止。
0 0
- C语言笔记:变量字节长度&取值范围——sizeof()VS strlen
- C语言变量取值范围
- C语言变量取值范围
- C strlen vs sizeof
- C语言基本数据类型的长度和取值范围
- c语言中 sizeof、strlen()学习笔记
- C语言——用sizeof求结构体所占字节长度
- 如何求C语言字符串长度(strlen函数和sizeof关键字)
- 如何求C语言字符串长度(strlen函数和sizeof关键字)
- C语言之——strlen()与sizeof()
- C语言专题——sizeof()与strlen()的区别
- 确定C语言各类型变量取值范围(通过头文件)
- 确定C语言各类型变量取值范围(不通过头文件)
- C语言sizeof和strlen
- C语言sizeof和strlen
- 我的小小学习笔记(1)之C语言--sizeof&strlen(1)
- C语言各种数据类型及其在系统中占的字节和取值范围
- C语言各种数据类型在系统中占的字节和取值范围
- Android6.0给开发者带来哪些影响
- XML基础
- shell中的特殊符号总结
- LeetCode--No.319--Bulb Switcher
- GetSystemMetrics函数
- C语言笔记:变量字节长度&取值范围——sizeof()VS strlen
- 正则表达式的实际应用(采集器,敏感词过滤,UBB翻译器)
- ScrollView等控件的代理协议
- Linux虚拟机系统下安装LAMP
- VIJOS P1889 天真的因数分解
- Hadoop实战——Hadoop架构思想、伪分布式无密登陆部署
- 5-20 打印九九口诀表 (15分)
- Maven实战:用maven来创建项目(用已有项目模板来创建项目)
- iOS 遮罩(mask)效果