一、初级篇——指针(*)、取地址(&)、解引用(*)与引用(&)的区别

C/C++中的指针(*),引用(&),取地址(&) 大一学C++的时候最怕的肯定就是指针方面的知识了,相信大家也是有这样的体会,但是懵归懵,现在我们得弄清楚一下里面的东西,但想要理解的明明白白,还是需要下一些功夫进去的 指针的形象概念: 假设第一个代表指针变量ptr,第二个代表整形变量h 第一个方框就是指针变量,指针变量存的内容是指向的变量的地址,所以我们会有如下指针: int * ptr=&a; 然后我们使用的时候,*ptr... 阅读详情
AI摘要

本文详细介绍了C语言中的指针与取地址操作,并解释了如何使用指针进行解引用及赋值操作来改变变量的值。同时,文章对比了C++中的引用概念,并讨论了使用引用的优点。

1. 初步了解——指针与取地址

先看程序:

#include<stdio.h>

int main(void)
{
	int num = 7;
	int *p = &num;//初始化指针,也可以写作int* p = &num;
	printf("%d 的地址是 %p\n", num, p);
	return 0;
}
上面int *p定义了一个指向int类型指针p(我们使用*符号把p声明为指针),并初始化p使其指向int类型的变量num,这里&num中的&是取地址操作符,当&作用于一个对象上时,它返回了该对象的地址。

所以这里指针p指向了num所对应的地址。(我测试时输出了0028FF1C)


2. 如何使用指针?——解引用与指针赋值

让我们继续:

#include<stdio.h>

int main(void)
{
	int num = 7;
	int *p = &num;
	printf("数值%d所在的地址是 %p\n", num, p);
	printf("指针p所指向的地址为 %p , 该地址上所保存的值为%d\n", p, *p);
	*p = 100;
	printf("指针p所指向的地址为 %p , 该地址上所保存的值为%d\n", p, num);
	return 0;
}

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

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


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

#include<stdio.h>

int main(void)
{
	int num = 7, another = -5;
	int *p = &num;
	p = &another;
	printf("%d\n", *p);//此时p指向了another,所以输出了another的值,即-5
	return 0;
}

3. 引用(引用概念在C++中才有,C中并没有)

从某种意义上来说,引用完全有别于上面说介绍的内容:

#include<cstdio>

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;
}

关键:作用在引用上的所有操作事实上都是作用在该引用所绑定的对象上。

可以用int *&refp = p;的方式将一个指针引用和一个指针绑定起来。

PS:如果还是不理解,可以把引用认为是一个对象的别名(外号、简称等等)。(类比#define ...,typedef ...)


答疑:使用引用有何优点?

在传参的时候,使用指针传参,编译器需要给指针另行分配存储单元,存储一个该指针的副本,在函数中对这个副本进行操作;而使用引用传参,编译器就不需要分配存储空间和保存副本了,函数将直接对实参进行操作。所以使用引用使得程序的运行速度更快,执行效率更高。


下一篇:二、中级篇——指针与数组

****转载请注明:http://blog.youkuaiyun.com/synapse7/article/details/10260339****

ESP8266+Mixly+MIXIO物联网实战:用色盘控制WS2812 RGB灯(附完整代码) 本文详细介绍了如何利用ESP8266微控制器、Mixly图形化编程工具与MIXIO物联网平台,快速构建一个可通过网页色盘远程控制WS2812 RGB智能灯带的实战项目。内容涵盖硬件接线、平台配置、代码编写与调试全流程,旨在帮助物联网爱好者与初学者轻松实现创意灯光应用,掌握智能硬件开发的核心技能。 阅读详情

相关推荐

Matlab处理气象数据(六)数据的面积加权

由于地理投影导致导致每个像元实际地面面积不同,越靠近北极实际面积越小,越靠近赤道实际面积越大,如果不进行面积加权就简单平均,会导致温度较实际温度偏低。 用以下公式计算地理投影每个像元的面积: double pi = 3.1415926; double R = 6371007.181; //units - m double area = (pi/180.0)*R*R*fabs(sin(dLat1/180.0*pi) - sin(dLat2/180.0*pi)) * fabs(dLon1 - dLo

设计の诗 1万+

c语言 解引用

前言 最近接触到了一个新的概念,叫“解引用”。就是在函数传参时,如果传入的是指针,在函数体中未对它解引用,那么,这个指针指向的值就不会发生改变。 引用别人博客中的概念: 在百度上面的解释是:&amp;quot;‘解引用’,我倒觉得可以从另一个角度理解,&amp;quot;*“的作用是引用指针指向的变量值,引用其实就是引用该变量的地址,“解&amp;quot;就是把该地址对应的东西解开,解出来,就像打开一个包裹一样,那就是该变量的值了,所以称为&amp;quot;解引......

优快云-ZCL 2万+

机械臂控制的基础知识

在现代工业中,机械臂的自动化控制已经成为智能制造的重要一环。控制机械臂涉及多个学科,包括机械设计、运动学、控制理论和编程等。本文将从以下几个方面介绍机械臂控制的核心知识点:机械臂的构成、运动学分析、动力学建模、控制方法及编程实现。

qq_45728381的博客 5470

指针与取地址符

指针用来存放地址,通过地址找到地址的内存单元 指针变量必须初始化 &amp;是取地址符,得到的就是内存地址 指针保存地址,&amp;用来取地址

Calean777的博客 631

【血汗泪心路历程】怎么彻底删掉Sangfor文件?怎么彻底删除easyconnect?删除sangfor后网络坏了、某些app无法正常启动怎么解决?

教程来源于网络的五湖四海+gpt解答。用到了好几个教程和方法,遂这篇总结一下。会标明出处!先上一下战绩:终于把sangfor扔进回收站里了!!!哈哈哈那一刻真的好爽。

weixin_71246590的博客 6万+

信号完整性入门:为什么工程师总爱用dB来描述衰减?

本文深入探讨了信号完整性分析中工程师偏爱使用dB(分贝)单位描述衰减的原因。dB通过对数转换,将大动态范围的乘除关系简化为加减运算,极大地方便了多级系统分析和链路预算计算。文章重点解释了-3dB点的核心意义,即功率衰减一半的临界状态,并阐述了其在评估信道带宽、插入损耗与回波损耗等关键参数中的实际应用,是高效工程思维和沟通的重要工具。

weixin_29263201的博客 385

指针、引用、解引用简单使用总结

空间占用和操作:引用在内部实现上通常被视为指针的语法糖,因此引用没有自己的独立存储空间,而指针本身需要分配存储空间来存储地址。此外,由于引用被看作是变量的别名,可以直接使用引用来访问变量,不需要解引用操作符 *,而指针需要通过解引用操作符来访问所指向的对象。而引用必须始终引用一个有效的对象,它不能指向空值。而引用一旦被初始化后,就无法再引用其他对象,它始终指向初始化时所引用的对象。修改指针指向的对象:通过解引用可以修改指针指向的实际对象的值。访问指针指向的对象:通过解引用可以访问指针指向的实际对象。

面条有点辣 2533

【华为鸿蒙3.0/荣耀安卓12使用VMOS Pro的激活方式 方法二】

关于荣耀手机安卓12如何解除进程限制,这里提供以下教程供小伙伴们参考。

Amy_mumu的博客 13万+

【C语言航路】第六站:指针初阶

主要详细讲解了指针与内存对于他们理解,指针和指针类型,指针类型的意义,野指针的成因,以及如何规避野指针,指针的三种运算,指针与数组的关系,二级指针,以及指针数组

青色_忘川的博客 3520

Code Composer Studio 12.0.0版本 官方例程导入实战指南

本文详细介绍了在Code Composer Studio 12.0.0版本中,如何利用内置的Resource Explorer工具高效导入官方例程的完整实战指南。通过分步讲解定位开发板、导入工程、配置编译器及调试验证等关键操作,帮助开发者快速上手TI微控制器开发,避免常见错误,有效提升学习与开发效率。

weixin_29169899的博客 122

3 路由引入

在大型企业网络中,网络规模十分庞大,选用单一的路由协议无法满足网络的需求,因此多种路由协议共存的情况十分常见。或者出于业务逻辑或行政管理的考虑,会在不同的网络结构中设计和部署不同的路由协议,使路由的层次结构更加清晰可控。路由引入是具有方向性的,将路由信息从路由协议A引入到路由协议B(A-to-B),则路由协议B可获知A中的路由信息,但是此时,A还并不知晓B路由协议中的路由信息,除非配置B-to-A的路由引入。表3-1:各种路由协议的优先级。通过路由引入,可以实现路由信息在不同路由协议间传递。

lwljh134的博客 621

引用与解引用(指针)

0x01 解引用 ​ 这是对指针的一种应用。解引用是指:通过指针,找到对应的内存和内存中的数据。我们可以通过解引用访问或修改指针指向的内存内容。 ​ 解引用后等价于指针指向的变量。 int a =1; int *p = &amp;a; //下面两者是等价的 *p += 1; a += 1; 0x02 引用与解引用 ​ &amp; 与 * 互为逆运算。&amp; ,其作用是取变量的地址;* ,其作用是取地址对应的内存,内存长度由指针类型确定,void 类型表示不确定,GCC 默认一个字节。 int

lwhaaaa的博客 1万+

【推荐100个unity插件】基于关节物理控制的自行车、电动车、摩托车模拟解决方案——Simple Bicycle Physics

摘要 &quot;简易自行车物理&quot;是Unity的自行车模拟资源包,支持Animation Rigging,实现基于关节物理的自行车控制。兼容所有平台和渲染管线,包含预制体、材质、脚本等资源。核心脚本Bicycle Controller管理自行车物理属性,支持自定义角色设置和移动端控制。安装后,用户可快速配置骑行场景,调整转向、速度、重心等参数,并支持地面贴合、兔跳等功能。适用于开发各类自行车模拟游戏和应用。 (字数:149)

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 1366

详解C++中指针(*)、取地址(&)、解引用(*)与引用(&)的区别

对于c语言中指针的操作符有两个:&amp;和*。对于&amp;,就是“取地址”的意思。但对于*,翻译为“解引用”,字面意思不好理解,即使看了后面内容才知道不过是“取指针指向的地址的内容”,"*"的作用是引用指针指向的变量值,引用其实就是引用该变量的地址,“解”就是把该地址对应的东西解开,解出来,就像打开一个包裹一样,那就是该变量的值了,所以称为“解引用”。也就是说,解引用是返回内存地址中保存的值。...

yhc166188的博客 9874

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

初级篇——指针(*)、取地址(&)、解引用(*)与引用(&)的区别

1. 初步了解——指针与取地址 先看程序: [cpp] view plain copy #include      int main(void)   {       int num = 7;       int *p = &num;//初始化指针,也可以写作int* p = &num;       printf("%d 的地址是

大幅度发鬼地方的博客 6580

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

【C语言跬步积累】——解引用操作符(*)、取地址操作符(&)复习、结构体(struct)、单精度型和双精度型的区别

不积跬步无以至千里,不积小流无以成江海!

PH_modest的博客 7143

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

【C++】指针:取地址(&)解引用(*)以及在使用指针时的一些易混淆的点

/ 输出变量的地址printf("变量num的地址: %p\n", &num);// 输出数组的地址(数组名本身就是首地址)printf("数组arr的首地址: %p\n", arr);printf("数组arr[0]的地址: %p\n", &arr[0]);// 与数组首地址相同// 输出指针变量自身的地址和它指向的地址int *p = #printf("指针p指向的地址: %p\n", p);// 指向num的地址printf("指针p自身的地址: %p\n", &p);

2302_76757983的博客 1573

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

1. 初步了解——指针与取地址 先看程序: [cpp] view plaincopy #include      int main(void)   {       int num = 7;       int *p = &num;//初始化指针,也可以写作int* p = &num;       printf("%d 的地址是 %p\n", num, 

OpenGenius - 【IOS】【cocos2d-x】 1435

详解C++中指针(*)、取地址(&)、解引用(*)与引用(&)的区别 (完整代码)

https://www.cnblogs.com/zsq1993/p/5977812.html 一、初步了解——指针与取地址 先看程序: #include&lt;cstdio&gt; int main(void) { int num = 7; int *p = &amp;num; printf("%d 的地址是 %p\n", num, p); return 0; } 上面int *p定义了一个指向int类型指针p(我们使用*符号把p声明为指针),并初始化p使其指...

哈呼呼屠露 1410

C++易搞混知识: 指针、引用与取地址运算符对比分析

本文围绕 C++ 中的指针、引用以及取地址运算符展开,对三者的语义、使用方式及相互关系进行系统对比分析。通过示例说明其在变量访问、函数传参等场景中的差异与联系,并对 int* p 与 int *p 等常见易混淆写法进行解释,帮助读者建立清晰、准确的理解框架。

稳扎稳打,持续进步 2793

引用和指针。&什么时候是引用,什么时候取地址,*什么时候指针,什么时候解引用,一篇带你搞懂双重用法

引用 为对象起了另一个名字,引用类型引用另外一种类型 int a = 10; int &amp;b = a; //b指向a(是a的另一个名字) int &amp;c; //错误:引用必须被初始化 一般初始化变量时,初始值会被拷贝到新建的对象中。但是定义引用,只是把引用和他的初始值绑定到一块,并不是拷贝给引用。一旦初始化完成,则和初始值对象一直绑定到一起,无法重新绑定另一个对象 引用即别名 引用并非是对象,他只是为一个已经存在的对象所起的另外一个名...

双鱼座boyy的博客 3188

关于&的引用与取地址 区分

在习惯了C语言的程序员眼里 , &amp; 这个符号的意思就是取地址和对位进行与运算 , 但在C++中 , &amp; 被重载多了一种意思 , 就是引用。 在这里我就不介绍位与运算了 , 我先介绍一下取地址运算 ,在学习指针的时候我们就已经用过了取地址符了 , 使用方法为在变量前面加上&amp;即可。 接下来是介绍引用 , 简单来说 , 引用就是被引变量的另一个名字 , 当改变引用值时 , 被引值也会改变 , 因为它们两就是同一个值 , 另外 , 引用不能脱离对象单独存在 , 引用是依附与对象...

是鲤鱼啊 3993

C++中 引用&与取地址&的区别

引用是给已定义的变量起别名。 引用:在声明的时候一定要初始化 #include &lt;iostream&gt; using namespace std; int main() { int a = 88; int &amp;c = a; //声明变量a的一个引用c,c是变量a的一个别名,如果引用,声明的时候一定要初始化 int &amp;d = a; //引用声明的时候一定要初始化,一个变量可以有多个引用 cout&lt;&lt;"a="&lt;&

顺其自然~专栏 4208

C++:指针微探(指针(*)、取地址(&)、解引用(*)与引用(&)的区别)

1:初步了解指针与取地址的 语法 #include&lt;stdio.h&gt; int main(void) { int num = 7; int *p = &amp;num;//初始化指针,也可以写作int* p = &amp;num; printf("%d 的地址是 %p\n", num, p); return 0; } 打印的结果就是 : 7 的地址是 000000B3FBEFF214 结论: 上面int *p定义了一个指向int类型指针p(我们使用*符号把p声明为指

C++ JAVA的专栏 1532
上一篇: Codeforces Round #105 (Div. 2) / 148A Insomnia cure (枚举 || 数论)
下一篇: 类型转换与字符串赋值、分割、合并、复制、比较、查询、翻转详解 (完整代码)
synapse7
博客等级 码龄14年 432粉丝 701原创
评论 8
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值