社区
C语言
帖子详情
请教*和&的用法!
BinaryWorld
2003-04-04 12:24:17
请教这两个符号的详细用法!
取地址,取值,引用等等!100分赠送!
...全文
88
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 共用一个地址~!
C语言中* & 和不写* &的区别
本文详细解析了C语言中变量地址、指针及指针操作的基本概念。通过实例,阐述了取地址运算符&、间接寻址运算符*以及直接引用变量的区别,帮助读者理解如何在程序中正确使用指针。
正则表达式中,[\s\S]* 什么意思。。。。“[ ]”不是范围描述符吗?
博客围绕正则表达式中 [\\s\\S]* 的含义展开。解释了 [ ] 表示里面包含的单个字符不限顺序出现,\\s 指空白,\\S 指非空白,[\\s\\S] 组合表示匹配所有字符。还提到与 \.\ 通配符相比,[\\s\\S] 能匹配换行,更适合有换行匹配的场景。
Latex排版多行公式,gather* 和 align*的区别
本文讲述了在撰写毕业论文时如何使用LaTeX中的align*和gather*环境来对齐单行和多行公式,以及它们各自的特点和适用场景。
int* & 求解!
本文解释了C++中`PushNode`函数使用`&`的原因,涉及指针传递时地址的更改,并通过`swap`函数演示了不同方法下地址和值的交换过程。,
\\n和\\s
本文详细解析了Java中转义字符的使用,特别是对“||”这一表达式的正确理解。文章深入介绍了Java如何处理字符串中的转义序列,包括八进制、Unicode转义字符以及特殊和控制字符。
C语言
70,040
社区成员
243,245
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章