| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 627 人关注过本帖
标题:新手遇难,求解释.各位大虾帮忙看看~~~
只看楼主 加入收藏
tianboyu2010
Rank: 2
来 自:重庆涪陵
等 级:论坛游民
帖 子:15
专家分:20
注 册:2010-11-8
结帖率:66.67%
收藏
已结贴  问题点数:10 回复次数:4 
新手遇难,求解释.各位大虾帮忙看看~~~
关于指针和引用的运用到底是怎么的?怎么感觉这两个东西是差不多的?
一个是指向系统分配的内存空间,一个是引用内存空间(我这样理解不知道对不对),这两个有什么区别勒?
搜索更多相关主题的帖子: 解释 
2010-12-06 22:43
半片叶zick
Rank: 2
等 级:论坛游民
帖 子:53
专家分:44
注 册:2010-11-30
收藏
得分:0 
我刚刚学习到指针,这个问题无法解,观望中。。。。。。。
明天再来看看!
2010-12-06 23:32
火龙果
Rank: 2
等 级:论坛游民
帖 子:42
专家分:79
注 册:2010-6-26
收藏
得分:1 
一下就是英文网站的解释
A pointer can be re-assigned any number of times while a reference can not be reassigned after initialization.//指针可以被重新赋值,引用就不可以
A pointer can point to NULL while reference can never point to NULL//指针可以指向NULL ,但是引用不可以
You can't take the address of a reference like you can with pointers//还有你获取地址的方式,两者也有区别
//////////////////////////////////////////////////////////////////////////////////////////////
C语言和其它程序性语言,如FORTRAN,Pascal,BASIC最大的差别就在于pointer,而pointer也是学习C语言最大的门坎,pointer的本意是希望function在传递数据时,不用将数据用copy的方式将数据copy进function的stack中,以加快程序执行速度和节省内存,如array通常占的内存都很大,若copy的方式势必降低速度且耗内存,但pointer的缺点就是程序不易阅读,需要一段时间去熟析这种怪异的语法。
C++为了解决pointer程序不易阅读的问题,增加了reference型别,C#/Java也取消了pointer,用reference取代pointer,但reference和pointer有什么不同呢?
Reference基本上存的也是『内存地址』,这和pointer一样,但pointer取值时,还必须dereference,也就是必须透过『*』才能取值,因此才会出现*** pointer to pointer to pointer这种难以理解的语法,但reference是一种『高级的pointer』,不需deference即可取值,所以不论是几层,仍然是reference这个变量而已,也因为不需dereference,所以书上都强调reference可视为变量的alias(别名、化名)(C++ Primer 4th P.59 A reference is an alias.),这使的reference骨子里存的是内存地址,但用起来却和一般变量一样方便,程序也漂亮许多,我们看一下(以下程序摘自 多型与虚拟 对象导向的精随 P.27侯俊杰)
 1#include <iostream>
 2
 3int* func1(int* x);
 4int& func2(int& x);
 5
 6int main() {
 7  int a = 0;
 8
 9  std::cout << *func1(&a) << std::endl; // output : 1;
10
11  std::cout << func2(a) << std::endl;   // output : 2
12}
13
14// Use pointer
15int* func1(int* x) {
16  (*x)++;
17
18  return x;
19}
20
21// Use reference
22int& func2(int& x) {
23  x++;
24
25  return x;
26}

各位就可看到,若用reference写,程序是不是好看很多了?再举一个例子,将两个变量的内容交换:
 1#include <iostream>
 2
 3void swap1(int* x, int* y);
 4void swap2(int& x, int& y);
 5
 6int main() {
 7  int x = 1;
 8  int y = 2;
 9
10  std::cout << "x=" << x << " y=" << y << std::endl; // Output : x=1 y=2
11  
12  // Use pointer
13  swap1(&x, &y);
14  std::cout << "x=" << x << " y=" << y << std::endl; // Output : x=2 y=1
15
16  // Use reference
17  swap2(x,y);
18  std::cout << "x=" << x << " y=" << y << std::endl; // Output : x=1 y=2
19}
20
21void swap1(int* x, int *y) {
22  int tmp = *y;
23  *y = *x;
24  *x = tmp;
25}
26
27void swap2(int& x, int& y) {
28  int tmp = y;
29  y = x;
30  x = tmp;
31}
32

以上的例子,都明显的发现reference的确比pointer优秀,但相信很多人跟我一样,基乎没有使用这种Call by pointer(reference)的方式传值,都使用Call by value的方式,因为怕的就是Side effect,由于argument和parameter的内存地址相同,若function中不小心改了parameter的变量,就造成argument变量值改变了,在其它语言的确没有解决的方案(C#/Java/VB),但在C++中,提供了const reference的方式,让parameter为只读,若程序不小心改了parameter,compiler会挡下来:
 1#include <iostream>
 2
 3int Add(const int& x, const int& y);
 4
 5int main() {
 6  int x = 1;
 7  int y = 2;
 8  int s = 0;
 9
10  s = Add(x,y);
11
12  std::cout << x << " + " << y << " = " << s << std::endl; // Output : 1 + 2 = 3
13}
14
15int Add(const int& x, const int& y) {
16  // x++; Compile error : you can not assign a varible that is const.
17  return x + y;
18}
19
20
21

所以为了程序效率以及节省内存,应该尽量使用reference来写程序,可以避免copy的动作,而且reference的写法程序的可读性远比pointer高,而写法基乎和一般变量一样,只有宣告reference时不一样而已。
2010-12-07 12:05
fy7518716
Rank: 2
等 级:论坛游民
帖 子:8
专家分:24
注 册:2008-6-17
收藏
得分:9 
int a = 10;
int b = &a;
int *c = &a;
上面b是a的引用,c是指向a的指针,他们都能访问到a,同时可以通过他们修改a中的值;什么区别呢?
理论到处都是,我这里不想说,想必你也看腻了。
举个形象的例子吧。
比如你现在想找到一个叫a的人:有一个叫c的人它手里拿着那个叫a的人的家庭住址,现在你通过c拿的那个住址当然能找到a。
                                                    那b又是什么呢,其实b更直接,b其实就是a,a这个人有两个名字,它叫a同时还叫b,找到来b就是找到了a本人。
仔细琢磨上面的例子。总结
    1、c和a其实是两个不同的人,都有各自的家。就像指针c和变量a都有自己的存储空间
    2、c和a他们脱离彼此存在,当a搬家时你如果还用c拿的地址去找的话有可能找到的就是别人。在程序中,如果a不存在了,通过c来访问就会出现传说中可怕的段错误。
    3、c可以拿a的地址,当然它也可以拿别的人的地址,但只能拿一个。就像c可以指向a,当然也可以指向别的整型变量
    4、b和a是同一个人,当然就只有一个家啦。就像c和a值占用一个存储空间。
    5、b和a是相互依赖的,没有了a,b存在也就没有了意义。就像b在声明的时候必须初始化

仔细琢磨哦,别辜负了我的一番心血。
2010-12-08 16:24
persistent_y
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2010-11-20
收藏
得分:0 
四楼的说的很好
2010-12-08 22:39
快速回复:新手遇难,求解释.各位大虾帮忙看看~~~
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.025424 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved