前面学习了c语言的环境搭建 数据类型 指针
这一章接着学指针
指针是什么?
指针其实就是一种类型, int* char*
指针的值是什么?
指针的值说白了就是内存地址,里面放的就是这玩意
举例:
int v1 = 123 //这个的意思就是vi这个变量 类型是int 值是123
int* v2 = &v1 ///这个的意思就是v2这个变量的类型是int* 值是&v1(就是v1值的内存地址)
*v2 //这个意思就是根据v2这个内存地址指向的值 也就是现在这个*v2等价于123
*v2 = 999 //这个意思就是把v2这个内存地址指向的值改成了999 也就是把v1的值改成了999
指针的指针(套娃)
int v1 = 123 // v1的类型为int, v1的值为123 v1的值的内存地址为0x1101(举例)
int* v2 = &v1 // v2的类型为int*, v2的值为v1的内存地址0x1101, v2的值的内存地址为0x1102(举例)
int** v3 = &v2 //v3的类型为int**(为什么后面是两个*?先看前面v1的类型是int,v2的指针类型就是在后面加了一个*也就是int*, 而v2的类型是int*,所以v3的指针类型也是在v2类型的后面加一个*也就是int**) v3的值就是0x1102,v3的值的内存地址为0x1103
同理
int*** v4 = &v3 //自行脑补
通过指针获取指针的值
*v2 //这个代表v2的值的内存地址指向的值(v2的值是v1的内存地址,v1的内存地址指向的就是v1的值也就是123) 所以*v2等价于123
*v3 //这个代表v3的值的内存地址指向的值(v3的值是v2的内存地址,v2的内存地址是0x1102,,而这个v2的内存地址的值指向的是v2的值也就是v1的内存地址,也就是0x1101) 所以*v3等价于v1的内存地址0x1101
* v4 //自行脑补 如果大家有更通俗易懂的解释也可以在评论区留言,我补充在后面
**v3 //首先v3的值指向的内存地址是0x1101, 在加一个* 就是0x1101这个内存地址指向的值 就是123
****v4 //自行脑补,规律一样
上面指针讲完了,继续下一个内容结构体
结构体
打包的概念,
struct Persion {
char name[30]
int age
};
struct Persion v1 = {"alex", 18}
struct Persion v2 = {"路飞学城", 3}
struct Persion v3 = {"李杰", 31}
struct 代表一个结构体Person代表结构体的名字, {}里面包含了一个字符数组和整型
struct Persion v1 = {"alex", 18} 表示创建了一个结构体对象v1, 并且把alex传给了name, 把18给了age
注意上面的代码如果要运行需要写在主函数里面,不然不能运行
#include <stdio.h>
#include <locale.h>
struct Persion {
char name[30];
int age;
};
int main() {
struct Persion v1 = {"alex", 18};
struct Persion v2 = {"路飞学城", 3};
struct Persion v3 = {"李杰", 31};
printf("v1的值是:%s", v1.name);
printf("v2的值是:%s", v2.name);
printf("v1的age的值是:%d", v1.age);
return 0;
}
结构体的指针类型
#include <stdio.h>
#include <locale.h>
struct Persion {
char name[30];
int age;
};
int main() {
struct Persion v1 = {"alex", 18};
struct Persion v2 = {"路飞学城", 3};
struct Persion v3 = {"李杰", 31};
printf("v1的值是:%s", v1.name);
printf("v2的值是:%s", v2.name);
printf("v1的age的值是:%d\n", v1.age);
// 结构体也可以有指针,上面实例化了v1对象,对吧
// 那现在完全可以创建一个指针类型的数据
struct Persion* v4 = &v1;
// 也就是v4的类型是struct Persion* (结构体指针类型) 值是v1对象的内存地址
//根据上面的思路,也可以通过v4获取其指向的数据
// *v4及代表v4的值指定的数据,就是v1的内存地址指向的数据,说白了就是v1这个对象
printf("v4指定的对象里的name的值:%s\n", (*v4).name);
printf("v4指定的对象里的age的值:%d\n", (*v4).age);
另一种写法
// 另一种写法
printf("v4指定的对象里的name的值:%s\n", v4->name);
printf("v4指定的对象里的age的值:%d\n", v4->age);
另一个知识点 链表 (作为了解即可,实际逆向中不会遇见)
链表
.