第一次写博客,水准不好,求不喷。
首先,sizeof不是一个函数,他是c的一个关键字,如同break,static,void一样。sizeof的作用简单地说是求一个对象(sizeof(a))或是一个数据类型(sizeof(int))在当前平台下需要占用内存大小,是被测对象本身类型的大小,而不是真正求对象本身占用了多少内存,sizeof不涉及对内存空间的访问。sizeof是在编译时完成,因此可以看成是一个常量,可以定义#define sizeof(int)。
sizeof表达式:
1.sizeof当做常量
#define N sizeof(int)//sizeof可以被看成是一个常量
2.常量求sizeof
sizeof('c'); //'c'的类型为char,所以等价于 sizeof( char );
sizeof(5); // 5的类型为int,所以等价于 sizeof( int );
3.变量求sizeof
int a; float b;
sizeof(a); //等价于sizeof(int);
sizeof(b); //等价于sizeof(float);
4.数据类型求sizeof
sizeof(int); sizeof(char);
5.数组求sizeof
char a[20]={"My name is laolang"};
sizeof(&a);//取字符数组a的地址,a当做一个数组,相当于sizeof(char[20])
sizeof(a); //a作为数组名,相当于sizeof(char[20])
sizeof(*a); //(*a)相当于取a[0]的值,表达式相当于sizeof(char)
sizeof(*(a+2));//相当于取a[2]的值,表达式相当于sizeof(char)
sizeof(a+2);//a作为指针,sizeof(char *)
注意: sizeof(*(a+100));//此表达式是合法的,sizeof没有访问a[100]只是求其类型的大小
char a1[] = "abc"; sizeof(a1)值为4因为字符数组末尾还有一个NULL
数组在函数中作为形参时相当于一个常量指针
void foo3(char a3[3])
{
printf("sizeof( a3 )的值= %d\n",sizeof(a3));//sizeof(a3)相当于sizeof(char *)
}
多维数组照此分析。
6.指针求sizeof
一般指针在一个编译器里是定值,32为处理器为4个字节。
char *p=a; char **ptr=&p;
sizeof(p)和sizeof(ptr)是一样的。要注意指针常量如 sizeof(a+2); a是一个一维数组。
7.结构体求sizeof
a)一般结构体
typedef struct stdd{
int name;
int num;
char cheng;
}LNode;
LNode di={1,2,'x'};
sizeof(di);//求数据结构di的大小,注意此处值为12,数据结构有对齐的机制。
sizeof(di->name);//数据结构di成员name的大小,值为4
sizeof(di.cheng);//数据结构di成员cheng的大小,值为1,值为cheng本身类型的大小
b)位域结构
typedef struct std{
unsigned int f1 : 1;
unsigned int f2 : 1;
unsigned int f3 : 1;
}Node;
Node li={1,0,1};
sizeof(li);//位域结构体li的大小
sizeof(li.f1);//!!!!!!!!!!不合法,位域成员不能用sizeof
8.函数求sizeof
a)有返回值的函数
int F(void)
{
return 0;
}
char F1(void)
{
return 0;
}
char * F2(void)
{
char a='c';
char *p=&a;
return p;
}
sizeof(F());//相当于sizeof(int)
sizeof(F1());//相当于sizeof(char)
sizeof(F2());//相当于sizeof(char *)
b)没有返回值函数
void count(void)
{
}
siezeof(count());//illegal sizeof operand,非法使用sizeof
这是我对sizeof的一点理解。以下为源代码及运行结果。
#include<stdio.h>
#include<string.h>
#include<stdio.h>
#define N sizeof(int)//sizeof可以被看成是一个常量
typedef struct stdd{
int name;
int num;
char cheng;
}LNode;
typedef struct std{
unsigned int f1 : 1;
unsigned int f2 : 1;
unsigned int f3 : 1;
}Node;
void count(void);
char * F(void);
void foo3(char a3[3]);
void foo4(char a4[]);
void main()
{
char cat[3]="as";
char a[20]={"My name is laolang"};
char b[3][3]={{0,1},{1,2},{2,3}};
char *p=a;
char **ptr=&p;
int d=10;
char e='r';
Node li={1,0,1};
LNode di={1,2,'x'};
printf("N的值= %d\n",N);
printf("sizeof('c')的值= %d\n",sizeof('c'));
printf("sizeof(5)的值= %d\n",sizeof(5));
printf("sizeof(5.5f)的值= %d\n",sizeof(5.5f));
printf("sizeof(5.5)的值= %d\n\n",sizeof(5.5));
printf("sizeof(d)的值= %d\n",sizeof(d));
printf("sizeof(e)的值= %d\n\n",sizeof(e));
printf("sizeof(int)的值= %d\n",sizeof(int));
printf("sizeof(float)的值= %d\n\n",sizeof(float));
printf("sizeof(&a) 的值= %d\n",sizeof(&a));//a作为数组名
printf("sizeof(a) 的值= %d\n",sizeof(a));//a作为数组名
printf("sizeof(*a) 的值= %d\n",sizeof(*a));//a作为char型的值
printf("sizeof(*(a+2))的值= %d\n",sizeof(*(a+2)));//a[2]的类型为char
printf("sizeof(a+2)的值= %d\n",sizeof(a+2));//a作为指针
printf("sizeof(*(a+100))的值= %d\n\n",sizeof(*(a+100)));
printf("sizeof(&b) 的值= %d\n",sizeof(&b));//b作为数组名
printf("sizeof(*b) 的值= %d\n",sizeof(*b));//做b[0]处理
printf("sizeof(*b+2) 的值= %d\n",sizeof(*b+2));//b作为指针
printf("sizeof(**b) 的值= %d\n\n",sizeof(**b));//做b[0]处理
printf("sizeof(p)的值= %d\n",sizeof(p));//p为指针
printf("sizeof(ptr)的值= %d\n\n",sizeof(ptr));//ptr为指针
printf("sizeof(di)的值= %d\n",sizeof(di));//数据结构di的大小
printf("sizeof(di.name)的值= %d\n",sizeof(di.name));//数据结构di成员name的大小
printf("sizeof(di.cheng)的值= %d\n\n",sizeof(di.cheng));//数据结构di成员cheng的大小
printf("sizeof(unsigned int)的值= %d\n",sizeof(unsigned int));
printf("sizeof(li)的值= %d\n\n",sizeof(li));
printf("sizeof(F())的值= %d\n\n",sizeof(F()));
foo3(cat);
foo4(a);
/*错误表达*/
//printf("sizeof(li.f1)的值= %d\n",sizeof(li.f1));//位域成员不能用sizeof
//printf("sizeof(count())的值= %d\n\n",sizeof(count()));
}
void count(void)
{
}
char * F(void)
{
char a='c';
char *p=&a;
return p;
}
void foo3(char a3[3])
{
printf("sizeof( a3 )的值= %d\n",sizeof(a3));
}
void foo4(char a4[])
{
printf("sizeof( a4[] )的值= %d\n",sizeof(a4));
}
运行结果:
转载于:https://blog.51cto.com/8106929/1440636