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

本人对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++中比较难的一块知识,暂且先学这些,主要用来复习数据结构里面链表或者树等相关知识。


版权声明:本文为qq_44899247原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。