指针:指针存放值地址,通过指针找到值
空指针:当创建好的指针,使用后的指针及时初始化成 空指针
指针类型的意义:
1.指针类型决定了解引用后能操纵的字节个数 字符指针解引用能操纵1个字符字节,整型指针解引用能操纵1个整型4个字节
// int a = 0x11223344;//a存十六进制数0x四个字节16进制数
// //int* pa = &a;当指针类型和值类型相同
// //*pa = 0; 改变是对a所占的所有字节作用
// char* pa = &a;//当指针类型和值类型不同
// *pa = 0; //改变只是对a所占字节中一个作用
2.指针类型决定了+1移动几个字节 字符指针p+1移动1个字节,整形指针p+1移动4个字节
指针运算:指针加减整数(注意指针类型决定加减移动的是几个字节)=指向内存空间的变化 。指针减指针=之内存储的地址差值=之间相差的字节数,也就是之间相差的内存空间数(加一个内存空间就等于加了一个字节,一个内存空间存一个字节)。
数组指针可以后越界 比如一共5个元素,索引最大为4,可以有p=&arr[5]的情况,不能前越界,不能有p=&arr[-1]的情况
二级指针,存指针地址的指针pp为二级指针,找到一级指针对应值要两个解引用**
// int a = 1;
// int* pa = &a;
// int** ppa = &pa;//存指针地址的指针pp为二级指针
// **ppa = 0;//a=0
指针数组:数组中每个元素都是一个地址,用索引找元素arr[0]就是用指针,创建指针数组:int*/char* arr[]={&a,&b,...}
// int c = 2;
// int* arr[3] = { &a,&b,&c };
// printf("%d", *arr[2]);//2 找到索引为2的元素&c,并解引用成c的值2
结构体类型里可以包含元素,数组,指针,结构体类型变量
//struct SubS
//{
// float number;//对齐数是4 存在偏移量0-3的位置
// char arr[20];//对齐数是1 存在1的倍数偏移量4-23的位置
// int* p;//对齐数是8 存在8的倍数偏移量24-31的位置
// struct Student b;//假设struct Student结构的最大对齐数是8,则它的对齐数就是8 存在8的倍数偏移量32-39,最后再补足成 成员中最大对齐数8的整数倍,就是说sizeof(struct SubS)=40个字节
//};
//struct SubS c = { 1.2,"HELLO",NULL,{"WORLD",0,"123123","女"} };//结构体变量c初始化用{},那结构体变量元素中套结构体变量b初始化也得用{}
定义的结构体占的字节数
各成员的存放规则:在零偏移处开始存放第一个成员。从第二个成员起,在各成员对齐数的整数倍的偏移量处开始存放各成员,最后总字节数还要补足成 成员中最大对齐数的整数倍。
各成员的对齐数:其他类型对齐数固定等于其类型所占字节数(用sizeof可算 int*-8 char*-8 char-1 int-4 double-8 float-4 ),结构体类型对齐数不固定等于结构体的最大对齐数。
函数如果传的实参是传值:传结构体类型变量,那就要用结构体类型变量的形参接收,找到变量对应属性还是用点。
函数如果传的实参是传址:传结构体类型变量取地址,那就要用结构体类型指针的形参接收,找到变量对应属性要么指针解引用加点,要么用指针加箭头。
C语言学习笔记3
最新推荐文章于 2024-08-21 11:22:17 发布