C语言运算符之sizeof

目录

前言

一、sizeof与基本数据类型

二、sizeof与指针变量

三、sizeof与数组

四、sizeof与函数参数

五、sizeof与struct

六、sizeof与union

总结


前言

(1)sizeof的含义

是一个C语言运算符,计算的是传进来的指针在内存中所占空间的大小,在编译时就获得了结果。

(2)特别注意

在32位编译环境中指针为4字节,long为4字节;在64位编译环境中指针为8字节,long为8字节。


一、sizeof与基本数据类型

cout<<sizeof(char)<<endl;                    //结果是1

cout<<sizeof(short int)<<endl;               //结果是2

cout<<sizeof(int)<<endl;                     //结果是4
cout<<sizeof(unsigned int)<<endl;            //结果是4

//32位系统
cout<<sizeof(long)<<endl;                    //结果是4
cout<<sizeof(unsigned long)<<endl;           //结果是4

//64位系统
cout<<sizeof(long)<<endl;                    //结果是8
cout<<sizeof(unsigned long)<<endl;           //结果是8

cout<<sizeof(float)<<endl;                   //结果是4

cout<<sizeof(double)<<endl;                  //结果是8

二、sizeof与指针变量

char *pc ="abcde";
sizeof(*pc);     // 结果为1(*pc的类型为char)
sizeof(pc);      // 结果为4

int *pi;
sizeof(*pi);     //结果为4(*pi的类型为int)
sizeof(pi);      //结果为4

char **ppc = &pc;  
sizeof(ppc);     // 结果为4   
sizeof(*ppc);    // 结果为4     
sizeof(**ppc);   // 结果为1(**ppc的类型为char)

double *pc ;
printf("%d",sizeof(*pc));    // 结果为8(*pc的类型为double)
printf("%d",sizeof(pc));     //结果为4

void (*pf)();    // 函数指针
sizeof(pf);      // 结果为4

注意:当用sizeof求指针的长度的时,无论有没有给指针赋值,或给指针赋值多少,都与其无关,都为四个字节。

三、sizeof数组

char a1[] = "abc";
int a2[3];
sizeof(a1); // 结果为4,字符末尾还存在一个'\0'终止符
sizeof(a2); // 结果为3*4=12(int类型为4字节)

void foo3(char a3[3])
{
    int c3 = sizeof( a3 ); // c3 == 4
}

void foo4(char a4[])
{
    int c4 = sizeof( a4 ); // c4 == 4
}
//'sizeof' on array function parameter 'str' will return size of 'char *'
//char a4[]相当于char * a4

注意:数组的sizeof值等于数组所占用的内存字节数。c3!=3。这里函数参数a3已不再是数组类型,而是蜕变成指针,相当于char* a3,为什么仔细想想就不难明白,我们调用函数foo3时,程序会在栈上分配一个大小为3的数组吗?不会!数组是“传址”的,调用者只需将实参的地址传递过去,所以a3自然为指针类型(char*),c3的值也就为4。

四、sizeof与函数参数

int func(char str[])
{
    return sizeof(str);
    //'sizeof' on array function parameter 'str' will return size of 'char *'
}

int main()
{
    char str[20] = "hello world!";
    printf("%d %d\n",sizeof(str),func(str));
    return 0;
}
//输出:20 4

五、sizeof与struct

struct MyStruct
{
    double dda1;
    char dda;
    int type
};
//sizeof(struct MyStruct)结果为16

(1)为上面的结构分配空间的时候,编译器根据成员变量出现的顺序和对齐方式,先为第一个成员dda1分配空间,其起始地址跟结构的起始地址相同(刚好偏移量0刚好为sizeof(double)的倍数),该成员变量占用sizeof(double)=8个字节;
(2)接下来为第二个成员dda分配空间,这时下一个可以分配的地址对于结构的起始地址的偏移量为8,是sizeof(char)的倍数,所以把dda存放在偏移量为8的地方满足对齐方式,该成员变量占用sizeof(char)=1个字节;
(3)接下来为第三个成员type分配空间,这时下一个可以分配的地址对于结构的起始地址的偏移量为9,不是sizeof(int)=4的倍数,为了满足对齐方式对偏移量的约束问题,编译器自动填充3个字节(这三个字节没有放什么东西),这时下一个可以分配的地址对于结构的起始地址的偏移量为12,刚好是sizeof(int)=4的倍数,所以把type存放在偏移量为12的地方,该成员变量占用sizeof(int)=4个字节;
(4)这时整个结构的成员变量已经都分配了空间,总的占用的空间大小为:8+1+3+4=16,刚好为结构的字节边界数(即结构中占用最大空间的类型所占用的字节数sizeof(double)=8)的倍数,所以没有空缺的字节需要填。

六、sizeof与union

union一次只能使用其中的一个元素,因此只分配给union其中size最大的元素的空间。

typedef union {
    Short i;
    int k[5];
    char c;
} Mat;

Typedef struct {
    int i;
    Mat j;
    double k;
}Like;
//sizeof(Like)+sizeof(Mat)为52
//此处int k[5]占用空间最大,20字节。
//struct会对其中所有元素分配内存空间,int 4,Mat 20,double 8,一共是32字节。

总结

提示:这里对文章进行总结:

sizeof总结

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值