第一次写博客,水准不好,求不喷。

   首先,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));

}


运行结果:

wKiom1PL3aWSwle8AAA4KcnyrIU479.png