C++最强大的地方之一在于指针。
关于指针,首先我来说一下,它的好处。
好处一,用指针传递数据,节省空间和时间
好处二,可以动态的创建数组,也就是说在程序编译的时候创建内存空间。
比如说:
int length;
cin>>length;
int * A = new int[length];
以上代码是正确的,而且也很节省空间,用多少就开多少空间。与之相对立的是静态编译,在程序执行之前就已经将空间定下来,如果把最后一行改成int A[length]是通不过,因为程序执行之前需要确定数组的大小。
然后,我想讲讲书上看到的一个例子,交换两个数
#include <iostream>
using namespace std;
void swap1(int p,int q)
{
int temp;
temp = p;
p = q;
q = temp;
}
void swap2(int *p,int *q)
{
int *temp;
*temp = *p;
*p = *q;
*q = *temp;
}
void swap3(int *p,int *q)
{
int *temp;
temp = p;
p = q;
q = temp;
}
void swap4(int *p,int *q)
{
int temp;
temp = *p;
*p = *q;
*q = temp;
}
void swap5(int &p,int &q)
{
int temp;
temp = p;
p = q;
q = temp;
}
int main(){
int a = 1,b= 2;
swap1(a,b);
swap2(&a,&b);
swap3(&a,&b);
swap4(&a,&b);
swap5(a,b);
cout<<a<<” “<<b<<endl;
return 0;
}
首先说一下,正确的交换函数是swap4,swap5
理由如下:
swap1传的是 值的副本,在函数体内修改了行参,但是它们是局部变量,不会影响主函数的a和b
swap2的问题是不符合逻辑,int * temp并未分配内存,系统会随机给它一个临时变量,会造成内存泄漏
swap3 只是指针的变化,而地址的值却没有变化,举个例子就是要交换两个仓库里的物品,函数的功能只是将它们仓库门上的钥匙换了换,有什么用
swap4可以实现两数的交换,因为它修改的是指针所指向地址中的值
swap5是一个引用传递,修改的结果直接影响实参
之后,我想说几个比较容易混的概念,的确比较难理清。
函数指针: void (*f) ()
指针函数: void* f() 这也就是函数返回指针
const指针: const int *
指向const的指针: int * const
指向const的const指针: const int * const
再来两个:
数组指针:指向整形数组的指针
int (*ptr)[]
指针数组:数组里存放的是指针
int *ptr[]
最后再来一大波:
Long (*fun) (int)
这是一个函数指针,指向函数的指针,返回值是long,参数是int
float (**def)[10]
def是一个二级指针,它指向的是一个一维数组的指针,数组的元素都是float
double *(*gh)[10]
gh是一个指针,它指向一个一维数组,数组元素都是double*
double (*f[10])()
f是一个数组,f有10个元素,元素都是函数的指针,指向的函数类型是没有参数且返回double的函数