今天上午在学习数据结构的过程中,写了一段错误的代码,找了一上午的错误才发现是因为用错了指针的问题,错误的关键点是:将指针当做形参其实也是值的传递,在在副本中改变了指针变量的内容,即函数内部改变了指针的指向,在函数外部指针的指向并没有改变。这种情况下应该要用双重指针或指针的引用作为形参。多说无益,直接上代码。
#include <iostream>
using namespace std;
void f1(int *a)//错误方法
{
int *s=new int;
*s=1;
a=s;
}
void f2(int **b)
{
int *s=new int;
*s=2;
*b=s;
}
void f3(int* &b)
{
int *s=new int;
*s=3;
b=s;
}
int main()
{
int *a;
a=NULL;
f1(a);
cout<<*a<<endl;
f2(&a);
cout<<*a<<endl;
f3(a);
cout<<*a<<endl;
return 0;
}
我的本意是在main中定义一个int*的变量,然后在f()函数中申请一块内存,让这个变量指向这块内存。最开始的想法就是f1()函数,然而当执行完f1()函数,然后输出时提示运行错误,仔细分析一下,这里肯定会出现运行错误,f1()函数形参的a是main()中a的一个副本,都是一个指针变量,main()中的a指向NULL,f1()中的a最开始也指向NULL,然而函数内部申请一一块内存s,并让a指向了s。再回到main()函数中,此时输出a的内容当然会提示运行错误,因为a指向的是一个NULL,没有内容。main()的a只分配了a的空间,而没有分配*a的空间;
要想做到在函数内部改变指针的指向,在函数外部也能得到更新,就必须使用双重指针或者指针的引用。先来谈谈双重指针,也就是指针的指针,看看f2()函数,形参是一个双重指针,实参是一个指针变量的地址,b的内容装的是main中a的地址,而a的内容也是一个地址,刚开始指向NULL,在f2()中申请了一块内存s,,*b即是a指向是同一块内存,改变*b的内容就是改变了a的内容;
再来说说指针的引用,如果b是a的引用,则a和b指是同一块内存,f3()中,b是一个int*变量的引用,是a的引用,即b和a是同一块内存空间,改变b的内容(b的指向)就是改变a的内容(a的指向)。