结构体的要点
1 只有结构体变量才分配地址,而结构体的定义是不分配空间的。
2 结构体中各成员的定义和之前的变量定义一样,但在定义时也不分配空间。
3 结构体变量的声明需要在主函数之上或者主函数中声明,如果在主函数之下则会报错。
4 C语言中的结构体不能直接进行强制转换,只有结构体指针才能进行强制转换。
结构体类型变量需要访问其成员时,用.运算符,如果是指向结构体变量的指针访问时,需要用->,或者先对指针解引用,取到指向的结构体类型的变量,再通过.访问,但是要注意优先级。
结构体作为函数参数时,一般通过传指针的方式来传参,为的是减少内存占用。
数据在内存中的存储
1.整型在内存中的存储
原码,反码,补码
1.符号位表示方法一样
a. 三种表示方法均有符号位与数值位
b. 符号位表示一样,0表示正,1表示负
2.数值位表示方法不一样
原码
直接将二进制按照正负数的形式翻译成二进制就OK啦
反码
原码符号位不变,其他位按位取反就OK啦
补码
反码加1就得到补码
整数的原码,反码,补码都相同
对于整型数据来说,数据在内存中是以补码的形式存放的
大小端问题
大端(存储)模式,是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中;
小端(存储)模式,是指数据的低位保存在内存的低地址中,而数据的高位,,保存在内存的高地址中。
浮点型在内存中的存储
任意一个二进制数都可以表示为浮点数,为下列形式:(-1)^S * M *2^E
a.(-1)^S为符号位 —> S为0时,表示正数,S为1,表示负数
b. M表示有效数字 —>大于等于1,小于2
c. 2^E表示指数位
单精度浮点数存储模型
对于32位的浮点数,最高的1位是符号位S,接着的8位是指数E,剩下的23位为有效数字M
双精度浮点数存储模型
对于64位的浮点数,最高的1位是符号位S,接着的11位是指数E,剩下的52位为有效数字M。
字符指针
字符数组
字符串常量是一个字符数组,例如:
“i am a string”
在字符串内部,字符数组以空字符 '\0' 结尾,程序可以通过检查空字符找到字符数组的结尾。字符串常量占据的存储单元数也因此比双引号内的字符数大 1。
字符指针
char *p;
p = "now is the time";
将一个指向该字符数组的指针赋值给 p。(C语言没有提供将整个字符串作为一个整体进行操作的运算符)
char a[] = "now is the time"; //定义一个数组
char *p = "now is the time"; //定义一个指针
a是一个仅仅足以存放初始化字符串以及空字符 '\0' 的一维数组,可以修改数组中的单个字符。
p是一个指针,其初值指向一个字符串常量,之后可以修改它指向其它字符串,可以输出它的内容中的某个字符,但修改不了它指向的字符串的内容。