ps:本人蒟蒻,如有错误请指正Orz
指针是什么
这个需要涉及到某些原理的问题:C++定义类型的时候,实际上是在内存中给你开辟了空间。比如你开了一个int类型,就会帮你开辟4字节的空间,你开了一个int数组a[x],就会为你开辟4*x字节的空间。但是开辟了空间之后,怎么修改呢?这时候就需要指针的存在,来指向空间。
指针的作用
有了指针,我们就可以知道空间所在的地址,好比你有了朋友的地址,可以前往了。有时,指针的存在可以加快程序的速度(比如你想在函数中调用一个数组,不用传上去,只需要知道该数组的地址,用指针即可,如何操作在下面讲解)。
指针的操作
1.指向数组
C++中,开了一个int数组a[x],实际上a就是一个指向a[0]的指针。用C++的地址符&表示,就是a==&a[0],而a+1就是a指向的地址往后推4个字节(a是一个int型的指针,所以+1的时候会往后推4个字节,如果a是long long型的指针,+1的时候就会往后推8个字节,以此类推),所以a+1==&a[1],又因为C++里*a表示a实际指向的内容(也就是说(*a)==a[0],这里没有地址符,是实际内容),所以(*(a+1))==a[1],这样就可以解释algorithm里sort的用法了:
sort(begin,end);
begin表示头指针,end表示尾指针,也就是从头指针到尾指针这一块区域排序。
所以,如果想把一个数组传进函数里,可以:
int XXXXX(int *a);
int *a就表示指向int的指针,在里面调用a[i]实际上就是*(a+i)。
2.指向结构体
你开了一个叫Node的结构体,那么你就可以开Node *a表示一个指向Node的结构体,想调用结构体内的内容怎么搞?(*a).XXXXX当然可以,但是C++提供了更方便(更形象?)的方法:a->XXXXX。
指针的妙用
有时你可能有两个只是拿来当成临时变量用的数组a和b(类型相同),某些时候需要对这两个数组进行交换,直接交换当然是可以的,不过我们可以用更快的方法达到同样的效果!先用两个指针指向a和b,然后交换指针,这样就不用交换所有元素了(当然实际上这两个数组内容没有交换)。
指针的好处&坏处
好处:常数小,因为直接修改内存。
坏处:难调试,很容易出现隐藏错误。