1. sizeof 与 strlen 的区别及使用
1)两者的返回类型均是size_t
- sizeof 计算的是分配空间的实际字节数,包括结束字符。
- strlen是计算的空间中字符的个数(不包括‘ ’)。
size_t strlen(char const* str);
2)sizeof是运算符,可以用数组、指针、类型、对象、函数做参数 。strlen是函数,只能以char*(字符串)做参数。而且,要想得到的结果正确必须包含 ‘ ’。
3)sizeof是在编译的时候就将结果计算出来了是类型所占空间的字节数,所以以数组名做参数时计算的是整个数组的大小(即使数组有的元素是空的)。正是由于在编译时计算,因此 sizeof 不能用来返回动态分配的内存空间的大小。
strlen是在运行的时候才开始计算结果,这是计算的结果不再是类型所占内存的大小,数组名就退化为指针了。
char str[20] = "hello world"; printf("strlen(str)=%d ",strlen(str)); //=11 printf("sizeof(str)=%d ",sizeof(str)); //20
char *s = (char *)malloc(20); strcpy(s, str); printf("strlen(s)=%d ",strlen(s)); //=11 printf("sizeof(s)=%d ",sizeof(s)); //=4 计算的是指针(sizeof(char *)) 的大小
4)具体而言,当参数分别是如下时,sizeof返回的值表示的含义如下:
数组----编译时分配的数组空间的大小;
指针----存储该指针所用的空间的大小(存储该指针的地址的长度,是长整型,应该是4);
类型----该类型所占的空间的大小;
对象----对象的实际占用空间大小;
函数----函数的返回类型所占的空间大小。函数的返回类型不能是void。
5)size_t 类型为无符号数,计算时注意
/*判断一*/ if(strlen(x)>= strlen(y)) { } /*判断二*/ if(strlen(x)- strlen(y)>= 0) { }
判断二永远为真,因为两个size_t 类型相减其结果仍然是size_t 类型,而 size_t 类型绝不可能是负的。
具体使用例子见:https://www.cnblogs.com/GuoXinxin/p/11651481.html
其他参考:
https://blog.csdn.net/magic_world_wow/article/details/80500473
http://c.biancheng.net/view/342.html
https://blog.csdn.net/songjiasheng1314/article/details/88644827
https://www.cnblogs.com/bixiaopengblog/p/8036429.html
2. 无符号数与有符号数之间的运算
C语言中有符号数和无符号数进行运算(包括逻辑运算和算术运算)默认会将有符号数看成无符号数进行运算,其中算术运算默认返回无符号数,逻辑运算当然是返回0或1
3. 求最终的i值
int i=1; for(i=1;i++<8;); cout << i; //输出9
4. sizeof计算struct及union
计算struct
字节对齐: 计算机为了快速的读写数据,默认情况下将数据存放在某个地址的起始位置,如:整型数据(int)默认存储 在地址能被4整除的起始位置,字符型数据(char)可以存放在任何地址位置(被1整除),短整型(short)数据存储在地址能被2整除的起始位置。这样字节对齐有助于加快计算机的取数速度,否则就得多花指令周期了。