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) = 8
4.指针变量的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) = 4
5.数组的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标准规定,函数、不能确定类型的表达式以及位域成员不能被计算s
izeof值。
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'停止。