day14
指针



1.指针变量
取地址操作符(&)


点F10开始调试 然后点调试 窗口 内存

在展示的时候 如果是2进制就太长了 所以按照16进制进行的展开
指针变量


拆解指针类型

cpp
{
char ch="w";
char *ch=&ch;
}
解引用操作符



如果⼀个指针变量的值是 NULL 时,表示这个指针变量没有指向有效的空间,所以⼀个指针变
量的值是 NULL 的时候,是不能解引用操作的
2.指针类型的意义
指针的解引用

16进制中占2进制的4个 所以16进制对应2进制的32字节是8个

指针+-整数




void* 指针
cpp
在指针类型中有⼀种特殊的类型是 void * 类型的,可以理解为⽆具体类型的指针(或者叫泛型指
针),这种类型的指针可以⽤来接受任意类型地址。但是也有局限性, void* 类型的指针不能直接进
⾏指针的+-整数和解引⽤的运算。



3.指针访问数组




4.--------动态内存管理



new /delete
new进行的返回地址
cpp
C++中通过 new 和 delete 操作符进⾏动态内存管理。
• new 负责申请内存, new 操作符返回的是申请到的内存空间的起始地址,需要指针存放。
◦ new 申请⼀个变量的空间, new[] 申请⼀个数组的空间
• delete 负责释放(回收)内存
◦ delete 负责释放⼀个变量的空间, delete[] 释放⼀个数组的空间
• new 和 delete 配对, new[] 和 delete[] 配对使⽤
new 不是只能给内置类型开辟空间,也可以给⾃定义类型开辟空间。
new double啥的也一样




使用指针实现链表
1.什么是数据结构
⼀般在算法竞赛中的链表为了追求效率问题,会使用数组来模拟实现,在工程中链表⼀般是使用指针来实现的。两种方式最好都能掌握。
cpp
数据结构是计算机的内存中存储和组织数据的⽅式。
数据结构关注如何以最有效的⽅式组织和存储数据,以便于在计算机程序中进⾏操作和处理。


2.链表的概念



3.链表的结构


先创建一个数据域:int data Node是一个自己命名的名字
还有一个指针域:使用* note获得一个的地址 返回的类型是struct next 所以是struct Node * next 在c++里面struct可以省略


4.链表的分类


5. --------动态申请链表节点和链表构建

像这个是局部的 所以一旦超过内存的范围就会被删除 所以需要使用动态申请
如果用的地址 可以用->指向所要指的成员

进行节点的链接(p2是地址 所以不用&p2)

cpp
动态申请节点并初始化
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* tmp=phead 那么tmp就是存放的phead的地址 也就是1的地址
下面当phead=phead.next 这个时候phead是2
用delete tmp进行的删除1的这个 因为tmp是1的地址
10. 单链表尾部删除元素

当删除最后的节点的时候 要注意上一个节点的next是NULL了

当1的next的next不是空的时候 那么继续进行下一个 进入了2
当2的下一个3的下一个是空的时候 就不进入下一个了
那么2的下一个进行删除 并且让2的next=NULL

11. 释放链表的所有节点
cpp
当链表不再需要的时候,申请的节点资源最好能释放掉,否则可能带来内存泄漏的⻛险。所有我们再
提供⼀个函数,释放链表的所有节点。其实这个就很简单了,我们调⽤⼀个删除元素的函数,直到把
链表删除为空链表就释放了所有的节点。
12. 面向对象(类或结构体)的方式实现链表
过程:用的函数





在面向过程的数据的时候使用的函数 所以在进行传入数据的时候需要把原来的数据进行传入
但是在面向对象的时候 因为使用的是列表 所以所有的数据都在里面 同时在调用里面的功能的时候phead都会不断的进行更新 所以不用像面向对象一样使用函数的时候进行更新数据



