指针易混点

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的函数

你可能感兴趣的:(C++)