指针和链表学习笔记
2025-09-09 20:34:23
发布于:浙江
指针
指针的概念
地址:内存中某个特定位置的标识符,用来表示内存中的某个特定位置。
比如,我们定义一个变量 x
,x
是这个变量的名字,而地址则是这个变量的“身份证”,“身份证”储存在内存空间中。
指针:指针是一个变量,它存储着某个变量的地址。
int x;
int *p=&x;//p是一个指针,它指向变量x的地址
// *代表声明p是一个指针类型的变量,储存的地址是int类型变量的地址
// &加在变量名前面,指的是获取后面变量的地址。
指针的运算
指针的运算有以下几种:
- 指针的赋值操作
int *p1=&x;
int *p2=&y; //两个指针指向不同的变量
p1=p2; //p1现在指向变量y的地址
错误操作:
int *p1=x; //错误,不能将一个变量赋值给指针
int *p2=&x+1; //错误,指针不能加1
long long y;
int *p3=&y; //错误,指针不能指向不同类型的变量
- 变量不可以直接赋值给指针,必须先获取变量的地址,再将地址赋值给指针。
- 指针不能加1,因为指针本身是一个变量,它存储的地址是一个内存地址,不能加 1。(数组的指针,可以 ++ 迁移到下一个变量的地址,因为他的地址是连续的。)
- 指针只能指向同一类型的数据,不能指向不同类型的数据。
注意事项
- 数组的地址是连续的,所以指针可以指向数组的任意位置,通过 ++ 或 -- 进行前后移动,每次移动的地址范围取决于这个数组数据类型单个变量所占据的字节数。
- 指针可以直接访问该地址实际保存的数据
int x=10;
int *p=&x;
cout<<*p<<endl; //输出10
平时我们访问变量数据的时候
变量名 -> 地址 -> 内存空间储存的数据 -> 获取数据
而指针直接访问地址指向的数据
指针变量名 -> 指针指向的地址 -> 内存空间储存的数据 -> 获取数据
如果想要通过指针访问地址数据的话,需要在指针变量名前面加一个*号,变回指针变量指向的地址所保存的数据。
链表
链表是一个数据结构,它是由一系列节点组成的。每个节点都包含数据和一个指向下一个节点的指针(单向链表),如果所存在着指向前一个节点的指针(双向链表),如果头尾相连,构成环,那么它就是一个循环链表。
链表的实现方式
如果想要实现链表,首先你要定义出节点的概念,通常来说会使用结构体来定义出一个节点的数据类型,然后再去通过创建对应节点数据类型的变量,相连在一起,从而组成链表。
- 定义节点数据类型
struct edge{
int data; //该节点保存int类型的数据
edge *next; //指向下一个节点的指针
edge *pre; //指向前一个节点的指针
};
- 创建节点(不需要变量名)
new edge; //new函数可以创建出一个没有变量名的空间,保存对应数据,它只存在一个地址
//为了保存它的地址,我们需要一个指针来保存
int *p=new edge; //指针p指向一个新的节点
小贴士:当你使用指针访问一个结构体成员的时候,这时候不可以使用 . ,而是使用 -> 来进行访问。
例:
p->data=10; //给结构体变量data赋值10
- 创建链表
- 如何遍历链表
链表当中,节点是以地址的形式保存在里面的,因此我只需要使用一个指针变量,使其从起点的地址变更到终点的地址即可。
edge *p=head; //指针p指向头节点
while(p!=NULL){ //当指针p不为空时,循环
cout<<p->data<<" ";//输出节点的数据
p=p->next;//指针p指向下一个节点
}
- 完整构建代码
#include<bits/stdc++.h>
using namespace std;
struct edge{
int data;
edge *pre,*next;
};
edge *head,*tail,*p;//头部指针、尾部指针、临时指针
void add(int x){
//函数添加一个数值为x的节点
p=new edge;
p->data=x;
p->next=NULL;//最后一个地址标记为空
if(head==NULL){
head=tail=p;//第一个节点
}else{
tail->next=p;//倒数第二个节点指向新插入的节点
tail=p;//最后一个节点替换为p
}
}
int main(){
int n;
cin>>n;
head=tail=NULL;//头尾为空指针
for(int i=0;i<n;i++){
int x;
cin>>x;
add(x);//放入函数添加节点
}
p=head;//从头部节点开始遍历到最后一个节点
while(p!=NULL){
//在当前节点不为空的情况
cout<<p->data<<" ";//打印当前节点数据
p=p->next;//替换为下个节点
}
return 0;
}
链表与数组的区别
- 数组是一块连续的内存空间,而链表是由一系列节点组成的,节点之间通过指针进行连接。
全部评论 2
22小时前 来自 浙江
0ber
22小时前 来自 浙江
0
lexore_最新力作
22小时前 来自 浙江
0
有帮助,赞一个