关于指针的*和&

虽说算法上指针用得比较少,但是终究是有用到的,本来学习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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值