【数据结构】考研复习笔记(C++)——指针

本文详细介绍了C++中的指针概念,包括指针的定义、*a与&a的区别以及指针操作中的优先级问题。通过实例解析了*a++和(*a)++的区别,并强调了指针在空间释放后的安全操作,建议使用NULL赋值。此外,还探讨了指针作为链表和树等数据结构中关键知识点的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本人对C++ 、数据结构、指针都不太熟悉,笔记根据天勤2022考研数据结构的网课和《高分笔记》记录,仅供学习,如有错误望指出!!

直接先上代码:

int *a = &p;

这是标准的指针的定义格式(值类型)
定义了a这个整型指针变量,指向p的地址。
此刻的输出:

int p = 12;
int *a = &p;
cout<<"p:"<<p<<endl;
cout<<"a:"<<a<<endl;
cout<<"*a:"<<*a<<endl;
cout<<"&p:"<<&p<<endl;

在这里插入图片描述

可以得出的结论是:

  • &p。是取地址的操作,把p变量所在的内存单元的地址取出。
  • a。是存放p的地址,即定义了a这个指针型变量后,a可以被赋值&p。
  • *a。是取内容的操作,把a指针所指向的变量的值取出。

所以可以推断出,如果你看到一个这样的式子:

a = &p;

那么这个a一定是提前定义过的指针变量,即在此之前一定有这样一行代码:

type *a;

还有一个操作:

int c = *a;

现在我们就很好理解了,*a代表的是a所指的值,所以c也是12。


那么接下来再看一个代码操作:

int p = 12;
int *a = &p;
*a = *a + 1;
cout<<"new p:"<<p<<endl;

输出结果是:
在这里插入图片描述

这里的操作是:把指针a指向的值,增加1,也就是p+1,所以输出的是12+1

这里我在写代码的时候发现,如果这样写是不行的:

int p = 12;
int *a = &p;
*a = *a++;
cout<<"new p:"<<p<<endl;

这里的输出结果p还是原来的值,即对a指针的操作没有对应到p上。
原因是:运算符的优先!!!
*a++的运算优先级是先对a++,然后再取值。
即现在的a指针已经不指向p了。我们用代码可以实验一下。

int p = 12;
int *a = &p;
cout<<"old &p:"<<&p<<endl;
cout<<"old a:"<<a<<endl;
*a = *a++;
cout<<"new p:"<<p<<endl;
cout<<"new &p:"<<&p<<endl;
cout<<"new a:"<<a<<endl;
cout<<"new *a"<<*a<<endl;

运行结果是:在这里插入图片描述
可以看到a存的地址已经发生了变化,指向了下一块内存单元。
而*a去取内容的时候发现,a指向的地址根本没有值,就返回空了(程序会运行很长时间)。

这里我们的解决方法是加括号:(*a)++


接着我们再来想一个问题:

如果a指针指向了一个空间,然后这个空间被释放掉了,而没有对a指针做一些什么操作,即a还是指向那片空间。接着再对这片空间赋一些其他的值,这时候咱们再去用a指针,就会发现a指向的东西早已不是它原先代表的东西了。 那这时候怎么办呢?

我们在对一个指针初始化,或者在一片被指空间释放后,可以对指针进行一个NULL的赋值操作。

int *a = NULL;
cout<<"a:"<<a<<endl;
cout<<"*a:"<<*a<<endl;

输出结果为:
在这里插入图片描述
可以看出赋值NULL后,a(存地址)为0,表示哪里也不指向;*a(存地址里的内容)为空,表示没有内容。

这里在写法上需要注意的是:

被允许的写法:
int *a = NULL;
或者
int *b;
b = NULL;

不被允许的写法是:
int *c;
*c = NULL; 

小结一下:

指针这里的主要考点和注意点有:

  1. 指针的定义模式:int *a = &p。注意符号。
  2. 搞清楚a、*a、p、&p分别指的p的地址;p的值;p的值;p的地址。
  3. *a代表值,所以可以做算术运算,但注意运算符优先级,最好不管怎样都加括号。
  4. 常用初始化操作是赋值为NULL。但要注意如何赋值:同把&p赋值给指针的操作一样,要么定义时赋值,要么定义完后给a赋值。

指针的东西其实还有很多,这是C++中比较难的一块知识,暂且先学这些,主要用来复习数据结构里面链表或者树等相关知识。

数据结构1800题1. 算法的计算量的大小称为计算的( )。【北京邮电大2000 二、3 (20/8分)】 A.效率 B. 复杂性 C. 现实性 D. 难度 2. 算法的时间复杂度取决于( )【中科院计算所 1998 二、1 (2分)】 A.问题的规模 B. 待处理数据的初态 C. A和B 3.计算机算法指的是(1),它必须具备(2) 这三个特性。 (1) A.计算方法 B. 排序方法 C. 解决问题的步骤序列 D. 调度方法 (2) A.可执行性、可移植性、可扩充性 B. 可执行性、确定性、有穷性 C. 确定性、有穷性、稳定性 D. 易读性、稳定性、安全性 【南京理工大 1999 一、1(2分) 【武汉交通科技大 1996 一、1( 4分)】 4.一个算法应该是( )。【中山大 1998 二、1(2分)】 A.程序 B.问题求解步骤的描述 C.要满足五个基本特性 D.A和C. 5. 下面关于算法说法错误的是( )【南京理工大 2000 一、1(1.5分)】 A.算法最终必须由计算机程序实现 B.为解决某问题的算法同为该问题编写的程序含义是相同的 C. 算法的可行性是指指令不能有二义性 D. 以上几个都是错误的 6. 下面说法错误的是( )【南京理工大 2000 一、2 (1.5分)】 (1)算法原地工作的含义是指不需要任何额外的辅助空间 (2)在相同的规模n下,复杂度O(n)的算法在时间上总是优于复杂度O(2n)的算法 (3)所谓时间复杂度是指最坏情况下,估算算法执行时间的一个上界 (4)同一个算法,实现语言的级别越高,执行效率就越低 A.(1) B.(1),(2) C.(1),(4) D.(3) 7.从逻辑上可以把数据结构分为( )两大类。【武汉交通科技大 1996 一 、4(2分)】 A.动态结构、静态结构 B.顺序结构、链式结构 C.线性结构、非线性结构 D.初等结构、构造型结构
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值