讨论一下C++中的指针和引用吧,我一直很困惑。(100分)

zhfj001 2008-11-18 04:49:41
我一直都没有搞明白指针和引用到底是个怎么回事,当然,书上的讲解也能看懂,但是,不能完全领会,以至于用到它们的时候我都非常小心,甚至很少用,今天特此开贴询问,希望各位能通俗地讲讲,可以从以下方面来说:
(1)指针和引用是什么,怎么用?
(2)指针和引用作为函数参数时又是怎样的?
很期待您的回复。多谢。
...全文
915 66 打赏 收藏 转发到动态 举报
写回复
用AI写文章
66 条回复
切换为时间正序
请发表友善的回复…
发表回复
xuruichen 2008-12-08
  • 打赏
  • 举报
回复
没有const引用吗?
那么复制构造函数的形参是什么?是不是指向const 对象的引用?
zhfj001 2008-12-08
  • 打赏
  • 举报
回复
看来需要自己好好的领会,用的多了自然就明白了,结贴,感谢各位。
dreamsdark 2008-12-04
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 wuyu637 的回复:]
指针和引用说到底的本质是一样的,都是一个存储内存地址的变量,这个内存地址里有一个对象,就是指针或引用指向的对象。

指针和引用的区别

(1)引用总是指向一个对象,没有所谓的 null reference .所有当有可能指向一个对象也由可能不指向对象则必须使用 指针.

由于C++ 要求 reference 总是指向一个对象所以 reference要求有初值.

String & rs = string1;

由于没有所谓的 null reference 所以所以在使用前不需要进行…
[/Quote]
顶一下
bfhtian 2008-12-04
  • 打赏
  • 举报
回复
up 1楼
双刃剑客 2008-12-04
  • 打赏
  • 举报
回复
http://blog.csdn.net/zhangmiaoping23/archive/2008/12/04/3443869.aspx
不好意思
上次我讲错了
如果你懂汇编代码
可以看看我这篇博客
zhouqing19871024 2008-11-21
  • 打赏
  • 举报
回复
int &b=a; //引用  如果有操作b=3;那么a也会被改成3,就像你的姓名叫李三,小名叫小三子,别人把小三子打了,也就是把李三打了,引用就是别名而已
哈哈 经典
zhfj001 2008-11-21
  • 打赏
  • 举报
回复
to zhangmiaoping23(42楼)
说的有道理,而且例子的确能说明问题,我开始有点明白了,谢谢。
zhfj001 2008-11-21
  • 打赏
  • 举报
回复
to muyingchi (33楼)
总结的通俗易懂,但,最好能给个例子,多谢。
zhfj001 2008-11-21
  • 打赏
  • 举报
回复
to snow_haoxue (23楼)
首先非常感谢,你的总结我看了,收获不少,但是,感觉还是有些疑惑。
tunnel115 2008-11-20
  • 打赏
  • 举报
回复
个人对指针和引用的一些理解

指针和引用都是操作内存的东东
不过指针和引用还是有区别的
根据我看过的C++Primer上的说法,主要是有两个区别
1)指针可以为空,也就是我们可以这样来定义指针

int m_ivalue=3;
int * p; //定义,不过为null
随后我们可以 p=&m_ivalue;
但是引用不能为空引用。必须在定义的时候就制定好引用对象
int &Refvalue=m_ivalue;

2)指针和引用的行为不同

同时赋值操作,对指针的赋值操作是改变了指针的值
而对引用的赋值操作是改变了,它引用对象的值
int x;
p=&x;//p指向了x
Refvalue=3;//是m_ivalue的值变为了3


山书生 2008-11-20
  • 打赏
  • 举报
回复
作为初学者,看了钱能的书还是没太理解.

学习~
sundevon 2008-11-20
  • 打赏
  • 举报
回复
谢谢楼上的 我还有点不懂
像 char * const * p3;
p3是指向char类型的const指针的指针;
是两个指针吧 不知我的理解有错误没
  • 打赏
  • 举报
回复
[Quote=引用 49 楼 sundevil42 的回复:]
const char **p2; // pointer to pointer to const char
char * const * p3; // pointer to const pointer to char
const char * const * p4; // pointer to const pointer to const char
char ** const p5; // const pointer to pointer to char
const char ** const p6; // const pointer to pointer to const char
char * const * const p7; // const poin…
[/Quote]

你想怎么解释,都是基本语法。只能帮你加点括号,让你看的明白点咯。
const char **p2;就是((const char) *)*p2;
char * const * p3; 是 (char *) const * p3;

如果还不明白,我也没办法。
  • 打赏
  • 举报
回复
指针就是该变量存放的地址呗,引用就是该变量本身,只不过换了个名字而已。你对如果对指针把握没信心的话,传参数就都引用好了。C++下很多情况用引用比较方便。
sundevon 2008-11-20
  • 打赏
  • 举报
回复
const char **p2; // pointer to pointer to const char
char * const * p3; // pointer to const pointer to char
const char * const * p4; // pointer to const pointer to const char
char ** const p5; // const pointer to pointer to char
const char ** const p6; // const pointer to pointer to const char
char * const * const p7; // const pointer to const pointer to char

注:

p2是指向const char类型的指针的指针;
p3是指向char类型的const指针;
p4是指向const char类型的const指针;
p5是指向char类型的指针的const指针;
p7是指向char类型const指针的const指针;

这几个对么?
我不明白这几个
谁能给解释下
zlaxr8888 2008-11-20
  • 打赏
  • 举报
回复
多看看书,里边都有,
xianyuxiaoqiang 2008-11-20
  • 打赏
  • 举报
回复
[Quote=引用楼主 zhfj001 的帖子:]
我一直都没有搞明白指针和引用到底是个怎么回事,当然,书上的讲解也能看懂,但是,不能完全领会,以至于用到它们的时候我都非常小心,甚至很少用,今天特此开贴询问,希望各位能通俗地讲讲,可以从以下方面来说:
(1)指针和引用是什么,怎么用?
(2)指针和引用作为函数参数时又是怎样的?
很期待您的回复。多谢。
[/Quote]
1.指针是保存地址值的特殊变量。使用*符号可以访问它对应的那个地址的其他变量。
比如:
int a = 1;
int *p = &a;//p保存a的地址值
*p = 2; //访问a,赋值为2
if(a == 2)
{
printf("yes!\n");
}

引用也是一个特殊变量,它实质是被引用的变量的别名
比如:
int a = 1;
int &b = a;//给a起个别名叫b
b = 2;//a 和 b实质对应同一个内存实体,改变b就是改变a
if(a == 2)
{
printf("yes!\n");
}

2.作为函数参数,举例如下:

void f(int *b)//指针
{
*b = 2; //访问所指变量
}
void g(int &b) //引用
{
b = 2; //访问被引用变量
}
void main()
{
int a = 1;
f(&a); //取地址给指针
if(a == 2) //a改变了
{
printf("yes!\n");
}
a = 1; //回复a
g(a); //传给引用
if(a == 2) //a改变了
{
printf("yes!\n");
}
}

指针和引用都可以改变它们对应的那个变量。更深入的理解要在大量的练习中积累。

光看书是纸上谈兵。据说看书的效果是30%左右,练习的效果是70%以上。
tsoslience 2008-11-20
  • 打赏
  • 举报
回复
有些时候可以把指针当成引用
把他们看成一样的在有些时候方便理解
daozi1 2008-11-20
  • 打赏
  • 举报
回复
呵呵,大家说了很多啊!
我想说一下指针和引用的复制;
指针和引用在内部的实现其实是没多大的区别的。但使用时有些地方是要注意的。因为引用具有对象行为,这一点很重要。
引用 复制时会调用对象的复制函数,在涉及多态时,这地方很容易出错。
class A{...};
class B:public A{...};
void f(A&a1,A&a2)
{
a1=a2;//此处调用的只有基类A的复制函数,而B部分不会被进行复制,之将导致数据的不一致(即B部分的数据没有被复制);
a1.fun();
}
而指针的复制就不存在这个问题,因为它的复制,具引用语义。而引用的复制具值语义;
love514425 2008-11-20
  • 打赏
  • 举报
回复
> 1 指针就是指向某一块内容的地址,引用就是一别名. 就好像别人你有个父母起的名字(正名),但或许也有个小名(别名).
> 2 在被调函数中,如果指针或引用的值改变,那么在主调函数相应的值也会改变.
加载更多回复(46)

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧