栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C语言运算符之sizeof

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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 *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,字符末尾还存在一个''终止符
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 %dn",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总结

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/976505.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号