虽说算法上指针用得比较少,但是终究是有用到的,本来学习c++的时候挺清楚的,但是比较长时间沒接触,已经忘了不少了。这里略略总结下在c++程序中写的指针。
最基础的语句:
#include<iostream>
using namespace std;
int main()
{
int a=10;
int *b=&a;
cout<<"a"<<a<<endl;
cout<<"*b"<<*b<<endl;
cout<<"&a"<<&a<<endl;
cout<<"b"<<b<<endl;
return 0;
}
这里一一解释一下。首先int a定义了一个int类型的变量a,并赋值为10。
int *b是将b定义为指向一个int类型的指针。*用来声明b是指针。后面=&a则是给b赋值,是a的地址。&是取地址符。所以作为指针的b存的是a的地址。
a输出的是a的变量的值。b输出的是b被赋的值,即a的地址。&a就是a的地址。*b则是b地址中存的数值,即a的数值。
接下来如果不是一个变量而是一个数组的话:
#include<iostream>
using namespace std;
int main()
{
int a[5]={10,9,8,7,6};
int *b=a;
int *c=&a[0];
for(int i=0;i<5;i++)
{
cout<<"*b+i:"<<*b+i<<endl;
cout<<"*(b+i):"<<*(b+i)<<endl;
cout<<"b:"<<b<<endl;
cout<<"b+i:"<<b+i<<endl;
cout<<endl;
}
for(int i=0;i<5;i++)
cout<<"*c+i:"<<*c+i<<endl;
return 0;
}
这里用b和c两个指针作示范,b和c其实是一样的,表达式里面的=a就像当于=&a[0],即指向a数组的开头。
而之后当要取a[1]时,将指针+1即可(观察输出的指针,你会发现事实上指针真正加的不是1而是4,这是因为单个int的长度是4个字节),注意*要在括号外面,不然相当于先取出指针指向区域对应的数值+1,如上面的*b+1和*c+i所示。
接下来是二维数组:
#include<iostream>
using namespace std;
int main()
{
int a[2][2]={10,9,8,7};
int x=99;
int *y=&x;
int **z=&y;
cout<<"**z:"<<**z<<endl;
cout<<"y:"<<y<<" z:"<<z<<endl;
int *b[2];
b[0]=a[0];
b[1]=a[1];
for(int i=0;i<2;i++)
for(int j=0;j<2;j++)
{
cout<<"*(*(b+i)+j):"<<*(*(b+i)+j)<<endl;
*(*(b+i)+j)=i+j;
cout<<"a[i][j]:"<<a[i][j]<<endl;
cout<<"(b+i):"<<(b+i)<<" *(b+i)+j:"<<*(b+i)+j<<endl;
cout<<endl;
}
return 0;
}
这里首先是**z,即指向指针的指针。z里面存的是y的地址,y存的是x的地址,而**z=*y=x,修改**z就是修改x。
然后是二维数组。注意二维数组如果是int**b=a,是会报错的,“不能在初始化时将int(*)[2]转换为int**”。
实现起来有两种方式,一种是数组指针, int (*b)[2],即b是指向一个size为2的一维数组的指针,若要指向a[1][0],即将b+=1。
另一种就是上面那种,是指针数组。int *b[2],说明这个数组里有2个指向int的指针。所以对于每一个b[i]都要赋值,即a[0][0]与a[1][0]。
两者最直观的区别在于,一个是只有一个指针,一个是有n个指针。一个的指针++指向下一行(a[i+1][j]),一个则指向下一列(a[i][j+1])。
在上面的指针数组的引用过程中,()与[]有共通,*(*(b+i)+j)=b[i][j]=*(b[i]+j)=(*(b+i)[j])。
关于数组指针与指针数组可以参考这个:http://see.xidian.edu.cn/cpp/html/476.html
最后是引用:
#include<iostream>
using namespace std;
int main()
{
int a,b;
int &x=a,&y=b;
x=3,b=5;
cout<<"a:"<<a<<" &a:"<<&a<<endl;
cout<<"b:"<<b<<" &b:"<<&b<<endl;
cout<<"x:"<<x<<" &x:"<<&x<<endl;
cout<<"y:"<<y<<" &y:"<<&y<<endl;
return 0;
}
可以看得到,当引用之后,a和x的地址已经是一样的了,这时候修改任意一个的值,相应的另一个数也会变成新的值。
参考:http://www.csdn123.com/html/itweb/20130824/79913_79908_79897.htm