请教*和&的用法!

BinaryWorld 2003-04-04 12:24:17
请教这两个符号的详细用法!
取地址,取值,引用等等!100分赠送!
...全文
59 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
cenlmmx 2003-04-04
  • 打赏
  • 举报
回复
int a=1;
int *p=&a; //取a的地址给指针p
int &b=a; //定义b为a的引用
*p+=1; //等于a+=1;

&出现在右边为取地址,在左边为引用.
不知道还该说什么?
matlab7 2003-04-04
  • 打赏
  • 举报
回复
sory 打错了。。
实参——形参
&a—— *p

matlab7 2003-04-04
  • 打赏
  • 举报
回复
实参——形参
*p—— &a
cenlmmx 2003-04-04
  • 打赏
  • 举报
回复
Pointers和 References是特殊变量,以存储内存地址当作它们的值。在你学会这些之前,其它相关的不同类型的数据类型还有:
int,double和char。Pointers和 References存放着已经声明并赋值的,不同数据类型的,你所操作数据的地址。这两种机制 Pointers 和 References,有着不同的语法和不同的惯性使用方法。

声明Pointers和 References

当对一个对象或数据类型的指针进行声明时,你照例地使用声明变量和数据类型的方法,仅是现在,对于声明SOMETYPE的指针,你需要在数据类型和它的变量之间加上星号*。 SOMETYPE* sometype;
int* x;
对于声明一个reference,你做的事情是和声明一个指针完全一样的,仅仅这次你不使用星号*,使用—来替换。 SOMETYPE& sometype;
int& x;
可能你已经学过,空位在C++中是不被考虑的,所以以下的指针声明都是一样的效果: SOMETYPE* sometype;
SOMETYPE * sometype;
SOMETYPE *sometype;
以下的references声明同理也是一样: SOMETYPE& sometype;
SOMETYPE & sometype;
SOMETYPE &sometype;

“寻址”操作符

尽管声明指针和references看似一样,但对它们进行赋值却是另一回事。在C++中,还有另外一种操作符需要你了解它,一个通过&符号来表示
的操作符,那就是“寻址”操作符。“寻址”操作符做的事如它的名称一样,返回一个变量、常量标识符或一个数组单元的地址,形式如当前类型的
指针。使用“寻址”操作符,加在变量之前使你得到返回的地址。 SOMETYPE* x = &sometype; //必须被当作 rvalue 使用。
现在,不要把“寻址”操作符与声明一个reference搞混淆。因为使用此操作符被严格局限于rvalue,或是等号的右边。编译器知道
&SOMETYPE是“寻址”操作符,表示返回一个SOMETYPE类型指针的地址。
此外,假如你有一个函数,以指针作为参数,你可以在不能声明成指针的变量上使用“寻址”操作符。通过这种方法,你不必再声明一个指针来充当此函数的参数使用。“寻址”操作符可返回一个指针,因此可以在这种情况下使用: SOMETYPE MyFunc(SOMETYPE *x)
{
cout << *x << endl;
}

int main()
{
SOMETYPE i;
MyFunc(&i);
return 0;
}

赋值pointers和references.

就像你看到使用“寻址”操作符的语法一样,一个指针被赋值得到“寻址”操作符的返回值。因为“寻址”操作符的返回值就是一个指针,所有事情
都考虑过了,你的代码应该通过编译。对于赋值给一个指针,它必须在内存中得到一个地址,不然编译器将给你提示错误。

int x;
int* px = &x;
上面一段代码说明了被声明为int类型的变量x,一个被声明为指针的变量并给赋值内存中x的地址。指针px实际上通过存储在内存中x的地址“指向”x。记住当声明一个指针时,需要同类型的指针在你所在地址中充当变量或常量。
现在这里你开始明白指针和references的不同了。赋值一个指针给内存中的地址,你不得不使用“寻址”操作符来返回指针变量在内存中的地址。
而一个references,不管怎样,都不需要使用“寻址”操作符赋值成内存中的地址。赋值一个地址给一个reference,你只需要使用变量充当rvalue值就行。 int x;
int& rx=x;
上面代码显示类型int的变量x被声明,然后reference rx也被声明,并且被赋值“充当”x。注意不管x的地址是怎样存储在rx中,或者说通过rx“被参考”,不必使用其他操作符,仅是变量。在你遇到必须声明同类型reference作为变量或常量的情况,你也必须遵循此类方法来充当指针。
有可能,你想知道一个指针能显示什么内容,就像这样: #include <iostream.h>
int main()
{
int someNumber = 12345;
int* ptrSomeNumber = &someNumber;
cout << "someNumber=" << &someNumber <<endl;
cout << "ptrSomeNumber=" << prtSomeNumber <<endl;
return 0;
}
假如你编译并运行此代码,你应该会得到变量someNumber输出12345,ptrSomeNumber将输出一个十六进制数(内存中地址都是以十六进制被实现的。)现在,如果你想输出prtSomeNumber所指的值,你应该使用这些代码:
#include <iostream.h>
int main()
{
int someNumber = 12345;
int* ptrSomeNumber = &someNumber;
cout << "someNumber=" << &someNumber <<endl;
cout << "ptrSomeNumber points to " << *prtSomeNumber <<endl;
return 0;
}
所以从原理上来说,当你想使用、修改或操作指针x所指的值,你就可以使用*x来充当此值或变量。
这里有一个指针和referenceds能做的事的速查列表:
你能赋值指针来“指向”内存中的地址。
你能赋值reference来“充当”变量或常量。
你能复制指针值给其他指针。
你能分别修改指针或references所指或充当的,在内存中存储的值。
你能对指针所指地址作递增或递减的操作。
你能传递指针和references给函数.


这下够齐了吧.
paulxj 2003-04-04
  • 打赏
  • 举报
回复
&取地址!
*取内容!

读程序的时候,看到&就读成取地址,看到*就读成取内容

蛮好理解的!
maurice1983 2003-04-04
  • 打赏
  • 举报
回复
int i = 10;
int* p = &i;
此时,p是i的地址,而加上一个*p则是i的值~~!

int &b = i;

b与i 共用一个地址~!

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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