一、指针
我对于指针的理解就是我们定义一个整型a,它在内存中就有一段空间,我们把整型的地址取出来给我们定义的指针,让它也指向a的空间,相当于给a的空间重新分配了一把钥匙,就可以访问到a的空间,然后用*加上我们的指针变量名就可以拿到a空间的值。
1.指针的值是一个地址编号,指针具有指向性,具有类型
2.地址是用来区分内存中不同字节的地址编号,指针可以直接操作内存。
3.指针是指向以自身地址编号开始的自己指向类型字节大小的连续空间,就相当于我们把定义的整型变量地址给它,它就是指向整型4字节大小的空间,注意,指针的类型需要和要指向的是同一类型的。
4.&符号是取地址符,用来获取一个指向操作数变量类型的指针。*指针运算符,用来获取一个指针类型数据所指向的空间。
注意:指针运算符只能操作指针。在32位操作系统上指针占4个字节,在64位占8个字节。
5.给指针变量初始化的时候让它指向NULL,就相当于整型的0;要不然它就会是一个野指针,所指向的空间为无效的非法的内存空间。
6.指针的运算
加法:p + N:指针向高地址偏移自身指向空间的数据类型字节数的N倍个字节。
减法:p - N:指针向低地址偏移自身指向空间的数据类型字节数的N倍个字节。
p + p 没有特定含义,编译不通过;p - p(必须同种类型的指针):两个指针地址编号之间包含的指针所指向空间类型的数量。
自加:p++; ++p:p = p + 1 指针向高地址偏移自身指向空间的数据类型字节数
自减:p--; --p:p = p - 1 指针向低地址偏移自身指向空间的数据类型字节数
7.数组的数组名是指向数组首元素的指针常量;但是在下面两种情况下数组的数组名代表数组;
①sizeof(arry) ②&arry
二、结构体
1.在现实生活中,我们常常需要描述一些事物的基本特征,单靠变量来定义的话就比较繁琐,所以,就有了结构体,它就可以把你定义的基本数据类型存放在里面。
2.定义
struct 结构体类型名
{
数据类型1 变量1;
数据类型2 变量2;
数据类型3 变量3;
........
数据类型n 变量n;
};
这里我们也可以用typedef来自定义一个类型别名
typedef struct 结构体类型名
{
数据类型1 变量1;
数据类型2 变量2;
数据类型3 变量3;
........
数据类型n 变量n;
}类型别名;
3.初始化
我们要给结构体初始化的时候可以全部初始化,也可以局部初始化。全部初始化就需要我们数据类型一一对应。就比如数据类型名加上要定义的变量名让它等于一个{},花括号里面写入对应的类型值,然后中间用逗号隔开。局部初始化就是里面赋值的时候你想要给那个变量赋值,就输入‘.’加变量名 = 值,来调用赋值。
4.访问
①可以通过结构体变量名访问结构体内部成员变量,但是要用“.”(结构体成员运算符)
②通过->访问但是前面必须是一个地址。
5.内存大小计算原则
①计算大小在64位默认是按4个字节来区分,放的下的就放下,超过就另外开辟一个4字节的空间来存放,到最后只有一个字符也默认是4个字节来计算。
②大小必须是自身最大数据成员的整数倍。
三、共用体
1.定义
它和结构体定义相似,只是把关键字换为union。
2.共用体和结构体的区别
结构体成员在内存中空间独立,而共用体在内存中空间共享,后面的会把前面的所覆盖。
3.判断内存大小端:
主机字节序:处理器在存取处理内存中的数据时的字节顺序;
大端存储:地址低位保存数据高位;
小端存储:地址低位保存数据低位;
网络字节序:大端;数据通信过程中数据的字节顺序。
四、枚举类型
1.定义
enum 类型名
{
枚举常量1,
枚举常量2,
......
枚举常量n
};
2.枚举类型是在预处理阶段执行的,不开辟空间。
3.枚举类型默认是整型,第一位是从0开始的,依次是1, 2, 3...等,如果想让它从你想要的数字开始,可以给它赋值。
五、其它知识
1.man手册第一章是命令,第二章是系统调用,第三章是标准库函数。
2.用scanf输入%c时前面加上空格可以过滤空格,整型不用过滤,默认就过滤了。