app逆向-c语言基础(下)

本文介绍了C语言中的指针概念,包括指针定义、内存地址、指针值以及指针的使用示例,如指针的指针(嵌套指针)和通过指针访问结构体成员。还涉及了结构体的定义与指针类型,以及链表的基础知识,但强调链表在实际项目中的应用较少。
摘要由CSDN通过智能技术生成

前面学习了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);

另一个知识点 链表 (作为了解即可,实际逆向中不会遇见)  

链表

 

 

 

 

 

 

 

 

 

 

 

 

 

.

 

  • 8
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值