01-题目

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整除的起始位置。这样字节对齐有助于加快计算机的取数速度,否则就得多花指令周期了。

 

 

原文地址:https://www.cnblogs.com/GuoXinxin/p/11651509.html