指针和引用

本文来源于
http://stackoverflow.com/questions/57483/what-are-the-differences-between-a-pointer-variable-and-a-reference-variable-in?rq=1
我用自己的语言表述一下:

总的区别:
1,指针可以多次改变其值,而引用一旦确定就不能改变关系。
就是说指针可以更改其指向的元素,而引用是绑定的关系
2,指针可以指向不存在的地方,其值可以为NULL,而引用必须和一个具体的元素绑定。
3,指针可以有算术运算,比如p++;但引用是不可以的

具体的内在区别:

c++标准非常小心的避开了规定编译器应该如何实现引用,大多数编译器将其通过指针来实现。
比如是下面这样的声明:
int &ri=i;
如果没有被优化掉(if it's not optimized away entirely,翻译的可能不准确),那么分配和指针同样大小的内存,然后把指针放到内存里面

综合来说,使用的时候注意一下两点就好:

  • 在函数的参数里面和返回量使用引用
  • 用指针来实现结构体和算法

As a general rule,
Use references in function parameters and return types to define useful and self-documenting interfaces.
Use pointers to implement algorithms and data structures.

补充一点我遇到的情况:

void foo(int a)
{
    a++;
}

int main()
{
    
    int a = 1;
    foo(a);
    std::cout << a;
}

这个函数执行之后a的值是不会改变的!

原因出于C语言固有的函数策略。具体地说:当我们以变量a为函数foo的参数的时候,函数foo将变量a的数据值刷写到该函数治下的变量x,也就是说,函数foo内部的变量x只是拥有了作为调用该函数的参数即变量a的数据值的私有副本。换句话说,函数foo内部的变量x,只是被初始化了一个值,至于这个值是从哪里来的,站在变量x的角度,它自己是永远无法知道的。这犹如: 代码: x = a ; 作为左值的x,只是被赋值以另一个左值a所能handle的内存区域上的数据,除此之外,有关左值a自己的其他一切信息,都不会传达给x。所以,在执行了上述语句之后,分别对左值x和a的任何更改性操作,都不会影响到对方。

要想通过改变a的值,就需要使用引用和指针了:

void foo(int &a)
{
    a++;
}

或者:

void bar(int *x)
 {
 (*x)++; 
} 

我们调用函数bar的写法,也应当有所改变,应当这样:
bar(&a);
此时,被传入函数bar的参数,是一个指向变量a的指针。函数bar治下的变量x(这是一个指针变量)所拥有的,依然仅仅是前者的值的一个私有副本。 函数bar在其内部,通过把间接访问(星号)操作符作用在这个私有副本上,handle到了变量a所对应的那块内存区域,从而,间接地在那块区域上刷写了新的数据。当然,变量a自已对此是一无所知的,只不过,以后当其他地方又“召唤”a的时候,a若自有记性,会心说:“唉?这个值跟原来的不一样了嘛,一定是哪个臭小子,在背地里拿了一个指向我的指针去间接地修改了这个值……”

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,053评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,527评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,779评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,685评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,699评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,609评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,989评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,654评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,890评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,634评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,716评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,394评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,976评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,950评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,191评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,849评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,458评论 2 342

推荐阅读更多精彩内容

  • 一.指针 ** 1.指针概念**:指针就是用来保存内存地址的变量。 2.声明指针的方式:int *p;与运算符*结...
    YBshone阅读 408评论 0 4
  • 从概念上讲。指针从本质上讲就是存放变量地址的一个变量,在逻辑上是独立的,它可以被改变,包括其所指向的地址的改变和其...
    IvanRunning阅读 366评论 0 1
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,591评论 18 139
  • 指针和引用在C++中很常用,但是对于它们之间的区别很多初学者都不是太熟悉,下面来谈谈他们2者之间的区别和用法。1....
    我家有个小太阳阅读 280评论 0 2
  • 指针和引用 1. 引用和指针有什么区别? 引用是 C++ 中新增的变量类型,是对 C 的一个扩充。引用给变量起一个...
    MinoyJet阅读 370评论 0 2