指针,确实是一个有趣味的东西。
指针:
1它是别的变量地址
2它自己却又是一个变量,它可以被赋予不同的(表示不同变量的地址)
隔着一层,有时候确实会产生一些令人误解的、区分不明的东西。
函数能够改变 的 是地址代表的量,或者 量本身(引用)。
下面,开始例证讨论。
从交换数据开始,
void swap(int a, int b)
{
int t=a;
a=b;
b=t;
}
大家都知道,传值引用,肯定换不过来。
伟大的指针出来了,
void swap(int *a, int *b)
{
int t=*a;
*a=*b;
*b=t;
}
如愿以偿,交换成功。才学的时候,觉得真是神奇吗,这个指针,厉害。
就是*太多了,烦得人不轻。人家强大呀,受着呗。
然后,有了这样一个问题:一个函数,为一个指针分配空间。如下:
#include <iostream>
using namespace std;
void create(int *, int);
int main()
{
int *a = NULL, len=10;
create(a,len);
for( int i = 0; i<len; i++ )
cout << a[i] << " ";
cout << endl;
delete []a;
a = NULL;
}
void create(int *ap, int n)
{
ap=new int[n];
for(int i=0; i<n; i++) ap[i]=i;
}
感觉可以的,程序运行不如预期,返回错误值。有问题,有严重的问题。
有啥子问题呢?指针也是一变量,传值过去了,函数内部的改变无效!
当ap是一个有效地址的时候,对*ap的改变,对地址存储内容的改变是有效的。
当ap是一个地址变量时,对ap值本身((指向的地址)的改变,不能返回到函数以外。
那么使用地址吧。
真是不好表达呀。一个存放内容 为 分配空间地址的量,这要是一个二级的指针。想着都烦。如下:
#include <iostream>
using namespace std;
void create(int **, int);
int main()
{
int *a = NULL, len=10;
create(&a,len);
for( int i = 0; i<len; i++ )
cout << a[i] << " ";
cout << endl;
delete []a;
a = NULL;
}
void create(int **ap, int n)
{
*ap=new int[n];
for(int i=0; i<n; i++) (*ap)[i]=i;
}
直接使用指针变量本身(引用),将是一个更易于表达的方式。
#include <iostream>
using namespace std;
void create(int *&, int);
int main()
{
int *a = NULL, len=10;
create(a,len);
for( int i = 0; i<len; i++ )
cout << a[i] << " ";
cout << endl;
delete []a;
a = NULL;
}
void create(int *&ap, int n)
{
ap=new int[n];
for(int i=0; i<n; i++) ap[i]=i;
}
实现了想法。