社区
C语言
帖子详情
请教*和&的用法!
BinaryWorld
2003-04-04 12:24:17
请教这两个符号的详细用法!
取地址,取值,引用等等!100分赠送!
...全文
59
6
打赏
收藏
请教*和&的用法!
请教这两个符号的详细用法! 取地址,取值,引用等等!100分赠送!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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 共用一个地址~!
javascript小技巧&&JavaScript[对象.属性]集锦 [转载了多篇]
因为这两篇太安逸了,东西很多,很实用,所以转到我格子里!总的来说,如果你要找js 的东西,而不看这两篇的话,肯定要多花好多时间!!哈哈!!如果你找的javascript的东西的话,建议你 ctrl+F 直接在这个页上找,因为这里80%有你要找的,但是要让你挨着看的话,你就准备看完就去配眼镜!! 事件源对象 event.srcElement.tagName
【收藏向】谷歌技术团队出品,Android开发入门教程,开源分享_goole合作的android教程
牛顿曾说过:“如果我看得更远一点的话,是因为我站在巨人的肩膀上”,这句话很具有实用价值,看完前面的介绍,你千万不要一上来就一头扎进源码的世界,小心你会进入二次元世界,处于混沌状态,最后崩溃乃至放弃求知之路,一定要合理利用现有的优秀资源,比如以上这份入门资料。当然,师傅领进门,修行在个人,系统化的学习资料只是辅助,最主要的还是自己的努力!同时,学习过程中,我们也要注意方法,比如遇到问题,一定要先尝试自己搜索和解决,解决不了再
请教
他人…**天道酬勤!!!
c语言中奇数阶乘怎么算,
请教
大家奇数和偶数的阶乘公式.我知道有两个:1*3*5*7*9*...*(2*n-1)=(2*n-1)!/(2^(n-1)*(n-1)!)2*4*6*8*10*...*n=(2...
【阶乘的概念】阶乘(factorial)是基斯顿·卡曼(Christian Kramp,1760 – 1826)于1808年发明的运算符号.阶乘,也是数学里的一种术【阶乘的计算方法】阶乘指从1乘以2乘以3乘以4一直乘到所要求的数.例如所要求的数是4,则阶乘式是1×2×3×4,得到的积是24,24就是4的阶乘.例如所要求的数是6,则阶乘式是1×2×3×……×6,得到的积是720,720就是6的阶乘....
list中使用merge()函数报错squence not orderd
list<int>m, n; //一系列初始化操作已省略 m.merge(n,less<int>()); for (list<int>::iterator it = m.begin(); it != m.end(); it++) cout << *it << " "; 输入如下: 上述代码运行后,出现了如下报错信息:
请教
班级大佬后...
手把手教你玩转SOCKET模型之重叠I/O篇(下)
四。 实现重叠模型的步骤作了这么多的准备工作,费了这么多的笔墨,我们终于可以开始着手编码了。其实慢慢的你就会明白,要想透析重叠结构的内部原理也许是要费点功夫,但是只是学会如何来使用它,却是真的不难,唯一需要理清思路的地方就是和大量的客户端交互的情况下,我们得到事件通知以后,如何得知是哪一个重叠操作完成了,继而知道究竟该对哪一个套接字进行处理,应该去哪个缓冲区中的取得数据,every
C语言
69,373
社区成员
243,080
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章