day14指针1.指针变量取地址操作符点F10开始调试 然后点调试 窗口 内存在展示的时候 如果是2进制就太长了 所以按照16进制进行的展开指针变量拆解指针类型{ char chw; char *chch; }解引用操作符如果⼀个指针变量的值是NULL时表示这个指针变量没有指向有效的空间所以⼀个指针变量的值是NULL的时候是不能解引用操作的2.指针类型的意义指针的解引用16进制中占2进制的4个 所以16进制对应2进制的32字节是8个指针-整数void* 指针在指针类型中有⼀种特殊的类型是 void * 类型的可以理解为⽆具体类型的指针或者叫泛型指 针这种类型的指针可以⽤来接受任意类型地址。但是也有局限性 void* 类型的指针不能直接进 ⾏指针的-整数和解引⽤的运算。3.指针访问数组4.--------动态内存管理new /deletenew进行的返回地址C中通过 new 和 delete 操作符进⾏动态内存管理。 • new 负责申请内存 new 操作符返回的是申请到的内存空间的起始地址需要指针存放。 ◦ new 申请⼀个变量的空间 new[] 申请⼀个数组的空间 • delete 负责释放回收内存 ◦ delete 负责释放⼀个变量的空间 delete[] 释放⼀个数组的空间 • new 和 delete 配对 new[] 和 delete[] 配对使⽤ new 不是只能给内置类型开辟空间也可以给⾃定义类型开辟空间。 new double啥的也一样使用指针实现链表1.什么是数据结构⼀般在算法竞赛中的链表为了追求效率问题会使用数组来模拟实现在工程中链表⼀般是使用指针来实现的。两种方式最好都能掌握。数据结构是计算机的内存中存储和组织数据的⽅式。 数据结构关注如何以最有效的⽅式组织和存储数据以便于在计算机程序中进⾏操作和处理。2.链表的概念3.链表的结构先创建一个数据域int data Node是一个自己命名的名字还有一个指针域使用* note获得一个的地址 返回的类型是struct next 所以是struct Node * next 在c里面struct可以省略4.链表的分类5. --------动态申请链表节点和链表构建像这个是局部的 所以一旦超过内存的范围就会被删除 所以需要使用动态申请如果用的地址 可以用-指向所要指的成员进行节点的链接p2是地址 所以不用p2动态申请节点并初始化 Node* createNode(int data) { Node* newNode new Node; newNode-data data; newNode-next nullptr; return newNode; }6.单链表元素的打印当cur不等于null或者nullptr空值的时候就可以打印data 并且根据节点的next进入到另一个节点上7. 单链表的头部插入元素当实参传入形参的时候 形参的改变不会改变实参 所以需要传入实参的地址才可以printList(phead);分两种情况 一个是空的 另一种是有数据的这样无论有没有数据都可以8.单链表的尾部插入元素9. 单链表头部删除元素phead做开始是1 当Node* tmpphead 那么tmp就是存放的phead的地址 也就是1的地址下面当pheadphead.next 这个时候phead是2用delete tmp进行的删除1的这个 因为tmp是1的地址10. 单链表尾部删除元素当删除最后的节点的时候 要注意上一个节点的next是NULL了当1的next的next不是空的时候 那么继续进行下一个 进入了2当2的下一个3的下一个是空的时候 就不进入下一个了那么2的下一个进行删除 并且让2的nextNULL11. 释放链表的所有节点当链表不再需要的时候申请的节点资源最好能释放掉否则可能带来内存泄漏的⻛险。所有我们再 提供⼀个函数释放链表的所有节点。其实这个就很简单了我们调⽤⼀个删除元素的函数直到把 链表删除为空链表就释放了所有的节点。12. 面向对象类或结构体的方式实现链表过程用的函数在面向过程的数据的时候使用的函数 所以在进行传入数据的时候需要把原来的数据进行传入但是在面向对象的时候 因为使用的是列表 所以所有的数据都在里面 同时在调用里面的功能的时候phead都会不断的进行更新 所以不用像面向对象一样使用函数的时候进行更新数据