阶段问题汇总
字符串
字符串在内存中是连续存储的
字符串的变量名是字符串第一个元素的地址的别名
这代表这这个变量名是常量地址,无法改变
但是可以参与到表达式中
类如
char s[]="abcde";
printf("%s",s+2)
/*将会输出cde,首地址往后偏移两位的值*/
字符串的终结符
字符串在C语言中只能依靠终结符’/0’来结束
C语言无法停止识别没有终结符的字符串
定义字符串时,C语言会自动加入终结符’/0’在末尾
sizeof()和strlen()的区别
sizeof()会得到所有数据的长度
strlen()只能获取字符串的长度,且遇到终结符’/0’自动停止
故,二者获取同一字符串的长度得到的值会不一样
char s[]="abc";
printf("%d %d",sizeof(s),strlen(s));
/*实际输出结果为4,3,区别在于一个识别到了终结符,一个识别到终结符停止了*/
运算时不同类型的数据如何转换
在C语言中,不同类型的数据如果要进行运算,必须转换为同一种类型的数据
因为在计算机中,int型变量运算最为简便,故所有低于int的数据类型在运算中会被转换为int型,这个过程被称为整型提升
其余变量进行运算时会根据有效数据位的大小进行转换,为了确保精度不丢失,所有的变量都会往高精度的数据类型进行转换,高精度也就代表着有效数据位越多
赋值也是一种运算,但是这个运算是用户自定义的,不遵循自动转换的规则,但遵循整型提升
强制转换数据类型就会按照下面的规则进行转换
长短不一的数据如何赋值
-
长的数据赋值给短的数据
- 低字节直接拷贝,高字节直接丢弃
-
短的数据赋值给长的数据
- 如果短的是有符号位的,高位补符号位,如果是负的,补完1之后,按位取反还是0,不影响数值
- 如果短的是无符号位的,高位补0
对于负数来说,以补码形式存储,按符号位补1,就是对数值补0,对数值不造成影响