前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >指针(*)、取地址(&)、解引用(*)与引用(&)

指针(*)、取地址(&)、解引用(*)与引用(&)

作者头像
Twcat_tree
发布于 2022-11-30 12:51:44
发布于 2022-11-30 12:51:44
88700
代码可运行
举报
文章被收录于专栏:二猫の家二猫の家
运行总次数:0
代码可运行

指针(*)、取地址(&)、解引用(*)与引用(&)

C++ 提供了两种指针运算符,一种是取地址运算符 &,一种是间接寻址运算符 *。

指针是一个包含了另一个变量地址的变量,您可以把一个包含了另一个变量地址的变量说成是"指向"另一个变量。变量可以是任意的数据类型,包括对象、结构或者指针。

指针与取地址

例程:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int main() {
    int num = 3;
    int* p = #			// 将变量num的地址取出来,存到指针p中
    printf("%d 的地址是 %p\n", num, p);
    return 0;
}

  
  123456

输出

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
3 的地址是 0x7ffeefbff3ac

  
  1

上面int* p定义了一个指针p,这个指针指向的地址所存放的变量的数据类型是int,在本例程中,即是指向int型变量num,而p的值即是变量num的地址。

而&num中的&是取地址操作符,当&作用于一个对象上时,它返回了该对象的地址,比如例程中的&num即是为变量num的地址。

解引用与指针赋值

例程

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int main(){
	int num = 7;  
	int* p = #  
	printf("数值%d所在的地址是 %p\n", num, p);  
	printf("指针p所指向的地址为 %p , 该地址上所保存的值为%d\n", p, *p);  
	*p = 100;  
	printf("指针p所指向的地址为 %p , 该地址上所保存的值为%d\n", p, num);  
	return 0;  
}

  
  123456789

输出:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
数值7所在的地址是 0x7ffeefbff3b8
指针p所指向的地址为 0x7ffeefbff3b8 , 该地址上所保存的值为7
指针p所指向的地址为 0x7ffeefbff3b8 , 该地址上所保存的值为100

  
  123

注意这里*操作符为解引用操作符,它返回指针p所指的对象的值(注意不是地址)。

我们可以对*p赋值(对左值赋值),从而改变p所指的地址上所保存的值,从而改变此地址所存储的变量num的值。(上面num的值变为100)

当然,我们也可以给指针p赋值,使其指向另外一个地址(这样就改变了在解引用时获取的左值):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int main(void)  
{  
    int num = 7, another = -5;  
    int *p = #  
    p = &another;  
    printf("%d\n", *p);//此时p指向了another,所以输出了another的值,即-5  
    return 0;  
}  

  
  12345678

输出

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-5

  
  1

引用

最通俗的解释:引用就是起别名

引用在C中没有,在C++中才有。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int main()  
{  
    int val = 7, val2 = 999;  
    int &refval = val, &refval2 = val2; //引用必须要初始化,使其绑定到一个变量上  
    //修改引用的值将改变其所绑定的变量的值  
    refval = -12;  
    printf("%d %d\n", val, refval);//-12,refval的值和val一样  
//将引用b赋值给引用a将改变引用a所绑定的变量的值,  
//引用一但初始化(绑定),将始终绑定到同一个特定对象上,无法绑定到另一个对象上  
refval = refval2;  
printf("%d %d\n", val, refval);//999  
return 0;  

}

输出

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-12 -12
999 999

 
 12

总结

*操作符:

定义一个指针

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int* p;

   
   1

将一个指针(地址)解引用得到改地址所存的值

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cout << *p << endl;

   
   1

&操作符

取地址,将某个变量在内存中所存放的地址拿到

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cout << &num << endl;

   
   1

引用,进行引用,可以理解为给变量起别名,作用在引用上的所有操作事实上都是作用在该引用所绑定的对象上。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int val = 7;
int &refval = val;

   
   12

Ref:

https://www.runoob.com/cplusplus/cpp-pointer-operators.html

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-09-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 指针(*)、取地址(&)、解引用(*)与引用(&)
    • 指针与取地址
    • 解引用与指针赋值
    • 引用
    • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文