wkq清秋枫叶
驱动小牛
驱动小牛
  • 注册日期2004-06-17
  • 最后登录2008-08-07
  • 粉丝1
  • 关注0
  • 积分53分
  • 威望8点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
阅读:1911回复:12

请教: 关于&(引用)的问题

楼主#
更多 发布于:2004-10-21 09:54
bool GetWord(char * thestring, char * word, int& wordOffset);
在上述函数的声明中,GetWord的前两个参数是字符串起始地址,第三个参数应如何理解: 整型变量?或者是整型变量地址?或者其它含义?

 请高手指教. 在此先谢谢!
xx_focus
驱动中牛
驱动中牛
  • 注册日期2003-08-06
  • 最后登录2007-06-08
  • 粉丝0
  • 关注0
  • 积分96分
  • 威望10点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-10-21 12:28
是一个地址符

int abc = 0;

void add(int &dest)
{
   ++ dest;
}

如果这样调用

printf("%d", abc);//abc = 0
add( abc );
printf("%d", abc);//abc = 1
wkq清秋枫叶
驱动小牛
驱动小牛
  • 注册日期2004-06-17
  • 最后登录2008-08-07
  • 粉丝1
  • 关注0
  • 积分53分
  • 威望8点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-10-21 13:45
我知道可以这样调用.
我尝试了GetWord函数的另外一种声明方法,
bool GetWord(char * , char * , int);
结果编译可以通过,但运行结果相差太远.
这两种声明差别何在?
xx_focus
驱动中牛
驱动中牛
  • 注册日期2003-08-06
  • 最后登录2007-06-08
  • 粉丝0
  • 关注0
  • 积分96分
  • 威望10点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-10-21 13:55
呵呵,以为举个例子就可以了

& 实际上是按地址传送变量,几乎接近于指针,函数在调用时直接使用外部传入变量地址,所以在使用前最好进行检测
 int *p = (int)&wordoffet;
if (NULL == p) return FALSE;

不带 & 的只理解为变量的拷贝,函数在调用时再次创建一个 int 类型的临时寄存器最为变量拷贝容器,使用这个容器不会影响外部
wkq清秋枫叶
驱动小牛
驱动小牛
  • 注册日期2004-06-17
  • 最后登录2008-08-07
  • 粉丝1
  • 关注0
  • 积分53分
  • 威望8点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-10-21 14:43
谢谢xx_focus,我刚才反复试验了你所说的例子.即使把abc放在main()之外声明为全局变量,把add函数改为
   void add(int abc)
{
++ abc;
}
   然后在main()中调用add(abc),结果还是不能影响abc的值.
   好像只有用引用这一条路,是吗?
xx_focus
驱动中牛
驱动中牛
  • 注册日期2003-08-06
  • 最后登录2007-06-08
  • 粉丝0
  • 关注0
  • 积分96分
  • 威望10点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-10-21 18:47
int abc;

void add(int abc)
{
++ abc;//这个是针对哪个变量的呢?我想即使编译通过,这个程序也是错误的!!
}

//===========================
那么这样呢?
void add(int a)
{
++ a;//显然只操作了一个外部变量的拷贝,没有把这个结果返回出去,所以也是无意义的
}

下面几种方法都是可以的
void add(int *a)
{
 (*a) ++;//or ++ (*a)
}

void add(int &a)
{
  a ++; //or ++ a
}

int add(int a)
{
   a ++;//or ++ a
   return a;
}
wkq清秋枫叶
驱动小牛
驱动小牛
  • 注册日期2004-06-17
  • 最后登录2008-08-07
  • 粉丝1
  • 关注0
  • 积分53分
  • 威望8点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-10-21 22:06
总算把这个简单的问题搞清楚了.
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
7楼#
发布于:2004-10-21 22:17
指针和引用其实没什么区别,只不过是编译器玩的把戏.
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
beineyes
驱动牛犊
驱动牛犊
  • 注册日期2004-10-16
  • 最后登录2005-11-25
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2004-10-23 22:38
c/c++是单向传递的。所以你想
void add(int abc)
{
++ abc;
}来改变abc得值怎么可能呀。你函数里边的add函数里边的abc和全局变量的abc是两回事么。
其实指针和引用没有什么本质的区别。就是引用方便点而已。当你要操作变量的值的话。不用*pointer了。直接用引用就行了。具体的底层实现我想也跟指针差不多把。让编译器多干点活就行了。
 :P
wkq清秋枫叶
驱动小牛
驱动小牛
  • 注册日期2004-06-17
  • 最后登录2008-08-07
  • 粉丝1
  • 关注0
  • 积分53分
  • 威望8点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2004-10-25 21:43
beineyes的回答很有道理.只是现在无法放分了.
hhyyss1220
驱动牛犊
驱动牛犊
  • 注册日期2004-12-29
  • 最后登录2006-04-08
  • 粉丝0
  • 关注0
  • 积分3分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2004-12-31 17:02
引用的本质还是转化为指针操作.
int abc;
void add(int abc)
{
++ abc;
}
在函数里面,abc是当局部变量使用,非全局变量.

qx126
驱动牛犊
驱动牛犊
  • 注册日期2002-02-28
  • 最后登录2005-06-05
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2005-01-06 11:37
& 实际上是按地址传送变量,几乎接近于指针,函数在调用时直接使用外部传入变量地址,所以在使用前最好进行检测
int *p = (int)&wordoffet;
if (NULL == p) return FALSE;

这个说法其实是错误的,引用和地址运算符其实是两回事,只有在C++中才有引用。如果是在C++中,这里&是引用符,引用符的意义就是给原来的变量取一个别名,没有取址的意义!修改别名的值就是修改原变量的值,所以以上表达式的if是永远不会成立的。可以参考C how to program中引用的使用.
DuanLF
驱动牛犊
驱动牛犊
  • 注册日期2005-01-10
  • 最后登录2005-01-13
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2005-01-13 12:30
下载C++ primer
好好看看,比在这里问强
游客

返回顶部