本人对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;
小结一下:
指针这里的主要考点和注意点有:
- 指针的定义模式:int *a = &p。注意符号。
- 搞清楚a、*a、p、&p分别指的p的地址;p的值;p的值;p的地址。
- *a代表值,所以可以做算术运算,但注意运算符优先级,最好不管怎样都加括号。
- 常用初始化操作是赋值为NULL。但要注意如何赋值:同把&p赋值给指针的操作一样,要么定义时赋值,要么定义完后给a赋值。
指针的东西其实还有很多,这是C++中比较难的一块知识,暂且先学这些,主要用来复习数据结构里面链表或者树等相关知识。
版权声明:本文为qq_44899247原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。