C语言扩展知识点

    一,关于sizeof总结

1.1 sizeof是什么

1.2 sizeof与其它操作符的关系

1.3 sizeof的主要用途

1.4  sizeof的使用

1.5  sizeof的结果

    二,结构体的位域

2.1 什么是结构体的位域

2.2 结构体的位域如何定义及定义时需要注意哪些问题?

2.3 位域变量的使用


一,关于sizeof的总结

1.1 sizeof是什么

sizeof是cyuyandeyizhong单目操作符,如++,--等。

  • sizeof操作符以字节形式给出其操作数的存储大小
  • 操作数可以是一个表达式或者包括在括号里类型名
  • 操作数的存储大小有操作数的类型决定

1.2 sizeof与其它操作符的关系

操作数的优先级为2级,比 /,%等三级运算符优先级高。它可以与其他操作符一起组成表达式,如:

i *sizeof(int); //其中int为类型变量。

1.3 sizeof的主要用途

sizeof操作符的一个主要用途是与存储分配和I/O系统那样的例程进行通信的。

void *malloc(size_t size),
size fread(void *ptr,size_t size,size_t nmemb FILE*stream)

sizeof操作符的另一个主要用途是计算数组元素中的个数。

void *memset (void* a,int b,sizef(a))

1.4  sizeof的使用

参数为数据类型或者为一般变量:

sizeof(int),sizeof(long),sizeof(char)等等。这种情况要注意不同的系统或者不同的编译器得到的结果可能是不同的。例如:int类型在16位系统中占2个字节,在32位系统中占用4个字节。

参数为数据或指针:

数组的sizeof就是数组所占用的内存字节数,而指针变量的sizeof与指针的对象没有任何关系。

char a[] = "abc";  //sizeof(a)=4,字符末尾还存在一个NULL终止符
int a [50];    //sizeof(a)=4*50=200求数组所占的空间大小
int *a = new int [50]; //sizeof(a) = 4,a为一个指针sizeof(a)是求指针的大小,在32位系统中,占用的是4个字节

参数为结构体类型:

  • 结构体中所又成员的大小都会被计入其中包括基本类型,数组,指针,嵌套的结构体等。如果结构体中包含指针,sizeof会测量指针本身的大小,而不是它指向的对象大小
  • 静态和动态分配的结构体大小可能会不同:静态声明的结构体其大小是在编译时确定的;而动态声明的结构体大小会在运行时动态计算
  • 如果结构体中有变长数据成员,sizeof只会计算这部分的固定部分
  • 枚举类型的大小通常等于最大的枚举值所占的数,并不是每个枚举值单独占据的空间

1.5  sizeof的结果

sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int类型。该类型保证能容纳实现所建立的最大对象的字节大小。ANSI C正式规定字符类型为1字节。

1、若操作数具有类型char、unsigned char或signed char,其结果等于1。

2、int、unsigned int 、short int、unsigned short 、long int 、unsigned long 、 float、double、long double类型的sizeof,在ANSI C中没有具体规定,大小依赖于实现,一般可能分别为2、2、2、2、 4、4、4、8、10。

3、当操作数是指针时,sizeof依赖于编译器。例如Microsoft C/C++7.0中,near类指针字节数为2,far、huge类指针字节数为4。一般Unix的指针字节数为4。

 下面是关于指针和数组的区别。

sizeof 加上数组名,表示数组所占内存大小,这个表达式结果是 11。

sizeof 加上指针,表示指针在内存中的大小,如果是 64 位系统,结果是 8。

二,结构体的位域

2.1 什么是结构体的位域

位域是结构体中的一个特殊成员,它允许我们指定该成员所占用的位数,而不是使用完整的字节或更大的单位。

2.2 结构体的位域如何定义及定义时需要注意哪些问题?

struct 标签或者结构体名
{
    数据类型 成员1:位宽;
    数据类型 成员2:位宽;
    ...
    数据类型 成员n:位宽;
}

举例说明:

struct   Data
{
     unsigned int a:5;
     unsigned int b:6;
     unsigned int c:7;
     unsigned int d:8;
     unsigned int i;
    
};

定义时需要注意de问题:

  • 结构体中的位域字段在赋值时,不要超出位段定义的范围;例如,struct BitFields中的flag1只有一位,取值只能是0或者1。
  • 结构体中的位域字段的类型必须指定为整型或字符型。
  • 构体中的一个位域字段必须存放在一个存储单元中,不能跨两个单元。如果第一个单元空间不能容纳下一个位段,则该空间不用,而从下一个单元起存放该位段。

注意:位于长度不能超过数据类型存储单元的长度,其中:

  1. char类型位段不能大于8位
  2. short int类型不能大于16位
  3. int类型位段不能大于32位
  4. long int类型位段不能大于32位

2.3 位域变量的使用

位于变量的使用方式和结构体成员的使用方式相同,其格式为:

位于变量名.位域名
位于变量指针->位域名
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值