指针和引用总结(详细,易懂,全面,直观)
我不去想是否能够成功,既然选择了远方,便只顾风雨兼程。
---汪国真
程序道路需要不断学习,不断研究,大家加油!!!
大家好呀!今天要和大家分享的是指针(c/c++)和引用(c++),也即指针与引用的区别,本文章有理论讲解,也有代码演示,适合每个人,我坚信,看完这篇文章,你对指针和引用的理解一定会更加透彻,清晰。
以下代码格式均用C++语言写,如果你还没学到,别慌,代码会有注释解释!
一.刨析引用特性:
1.引用的定义:
引用是给一个变量取一个别名,以整形变量a为例,引用的形式为int &b=a(给a去一个别名叫做b),又比如(小明在家被家人叫做小明,在外被同学叫做小狗,这个小狗就是小明的别名,则int&小狗=小明),需要注意的是引用不是定义一个变量,而是给已存在的变量取一个别名,这个别名和变量名是共同存储在一块内存空间的。
举一个简单的例子,帮助大家理解;
直接上代码:
using namespace std; //这是头文件,与c语音#include<stdio.h>相似;
int main() // 这是声明一个命名空间的意思;
{int a = 10;int& b = a; //变量a的别名为b;注意左边是别名,右边是实名;cout <<"a=" << a << endl; //cout与c语言的printf相似,输出a的值;cout <<"b=" << b << endl; //输出b的值;//endl是一个换行符,形如c语言里面的\n,注意这个l不是1,而是小写的L;return 0;
}
执行结果如下:
![](/assets/blank.gif)
2.引用在定义的时候必须初始化:
直接上代码:
#include<iostream> //这是头文件,与c语音#include<stdio.h>相似;
using namespace std; // 这是声明一个命名空间的意思;
int main()
{int a = 10;int &b; //引用未初始化,编译器会报错;int &b = a; //初始化为a,这语句的意思就是给a起一个别名叫做b;return 0;
}
3.一个变量可以有多个引用:
直接上代码:
#include<iostream>
using namespace std;
int main()
{int a = 10;int &b = a;int &c = a;cout <<"a=" << a << endl;cout <<"b=" << b << endl;cout <<"c=" << c << endl;return 0;
}
执行结果如下:
![](/assets/blank.gif)
4.常引用与普通引用:
注意:常引用不能通过引用来改变变量的值,就相当于const int *const a;
#include<iostream>
using namespace std;
int main()
{普通引用:int a=10;int& b = a; //普通引用可以通过引用来修改变量a的值,相当于int *const a(指针常量)常引用://同类型的常引用const int a = 10;int& b = a; //编译器会报错,因为a是常量,不能通过普通引用来引用a;//不同类型的常引用float a=10.24;int &b = a; //编译器会报错,因为10.24是常量;return 0;
}
5.一个变量的引用只能引用一个实体:
直接上代码:
using namespace std;
int main()
{int a = 10;int& b = a;int& c = a; //b和c均为a的别名,即引用,也就是说一个变量可以有多个引用int a1 = 10;int a2 = 10;int& b = a1;int& b = a2; //引用的变量只能唯一,也就是在别名(b)一样的情况下,右边的变量(a1||a2)只能唯一return 0;
}
6.引用总结:
(1)引用是给一个变量取一个别名格式为int &a=b;
(2)引用在定义的时候必须初始化;
(3)一个变量可以有多个引用;
(4)常引用与普通引用;
(5)一个变量的引用只能引用一个实体;
二.引用和指针的区别:
1.两者的定义与性质不同:
指针是一个变量,存储的是一个地址,指向内存的一个存储单元;
引用是原变量的一个别名,跟原来的变量实质上是同一个东西;
#include<iostream>
using namespace std;
int main()
{int a=1024;int*p=&a;// p是指针, &在这里是求地址运算int&b=a;// r是引用, &在此起标识作用return 0;
}
上面定义了一个整型变量 a,p 是一个指针变量,p 的值是变量 a 的地址;
然而引用 b,b是 a 的一个别名,在内存中 b 和 a 占有同一个存储单元;
2.指针可以在定义的时候不初始化,引用必须在定义的时候初始化:
#include<iostream>
using namespace std;
int main()
{int*p;// 合法,指针可不初始化;int&r;// 不合法,引用不可不初始化;int a=996;int&r=a; // 合法return 0;
}
3.指针可以有多级,引用只能是一级:
int**p;// 合法
int&&a;// 不合法
4.指针可以指向NULL,引用不可以为NULL:
#include<iostream>
using namespace std;
int main()
{int*p=NULL; // 合法,指针可以指向NULLint&r=NULL; // 不合法,引用不可以为NULLreturn 0;
}
5.指针初始化之后可以再改变,引用不可以:
#include<iostream>
using namespace std;
int main()
{int a=1024;int*p=&a; // 初始化, p 是 a 的地址int&r=a; // 初始化, r 是 a 的引用int b=885;p=&b; // 合法, p 更改为 b 的地址r=b; // 不合法, r 不可以再变return 0;
}
6.sizeof 的运算结果不同:
int a=1024;
int *p=&a;
int &r=a;
cout<<sizeof(p);// 返回 int* 类型的大小
cout<<sizeof(r);// 返回 int 类型的大小
注意:64位机器上,int* 类型的大小为8个字节,int类型的大小为4个字节。
32位机器上,int* 类型的大小为4个字节,int类型的大小为4个字节。
7.自增运算意义不同:
如下图所示,p++之后指向a后面的内存,然而b++相当于a++
#include<iostream>
using namespace std;
int main()
{int a=1024;int*p=&a;int &b=a;p++;b++;return 0;
}
8、指针和引用作为函数参数时,指针需要检查是否为空,引用不需要:
void fun(int*p)
{// 需要检查P是否为空if(p==NULL){cout<<"需要检查p是否为空"<<endl;}
}void fun(int&b)
{// 不需要检查bcout<<"不需要检查b"<endl;
}
注意:指针和引用都可以作为函数参数,改变实参的值。
9.总结:
(1)两者的定义与性质不同;
(2)指针可以在定义的时候不初始化,引用必须在定义的时候初始化;
(3)指针可以有多级,引用只能是一级;
(4)指针可以指向NULL,引用不可以为NULL;
(5)指针初始化之后可以再改变,引用不可以;
(6)sizeof 的运算结果不同;
(7)自增运算意义不同;
(8)指针和引用作为函数参数时,指针需要检查是否为空,引用不需要;
以上如有错误请求指出,谢谢你们,晚安!!!
2022.01.12
From:努力进大厂的新青年
指针和引用总结(详细,易懂,全面,直观)相关推荐
- 【C++引用超详细笔记, 引用、指针和值传递的汇编级辨析,对象、继承和引用】
文章目录 引用变量 1. 什么是引用.如何创建一个引用变量? 2. 引用的具体使用方法 2.1 引用做函数的形参 2.2 引用参数的const用法 左值.右值是什么? 2.3 结构体的引用 2.4 引 ...
- C语言的指针*和引用
首先是一道关于类型转换的面试题,要求给出float变量强制转换成int型和int &输出的结果. [cpp] int test() { float a = 1.0f; c ...
- c++中的引用和python中的引用_对比 C++ 和 Python,谈谈指针与引用
作者 | 樱雨楼 引言 指针(Pointer)是 C.C++ 以及 Java.Go 等语言的一个非常核心且重要的概念,而引用(Reference)是在指针的基础上构建出的一个同样重要的概念. 指针对于 ...
- c语言实参形参函数调用指针引用 符号实例,C语言实参、形参、函数调用、指针、引用、符号实例.doc...
C语言实参.形参.函数调用.指针.引用.符号实例 C语言实参.形参.函数调用.指针.引用.*&符号实例 实现环境:VC6 程序源代码: #include "stdio.h" ...
- 最详细易懂的CRC-16校验原理(附源程序)
from:http://www.openhw.org/chudonganjin/blog/12-08/230184_515e6.html 最详细易懂的CRC-16校验原理(附源程序) 1.循环校验码( ...
- 【转】指针和引用的区别
c++中的引用与指针的区别 ★ 相同点: 1. 都是地址的概念: 指针指向一块内存,它的内容是所指内存的地址:引用是某块内存的别名. ★ 区别: 1. 指针是一个实体,而引用仅是个别名: 2. 引用使 ...
- C++中的指针与引用
写在前面 指针和引用形式上很好区别,但是他们似乎有相同的功能,都能够直接引用对象,对其进行直接的操作.但是什么时候使用指针?什么时候使用引用呢?这两者很容易混淆,在此我详细介绍一下指针和引用,力争将最 ...
- C++中的指针与引用(转)
原文地址: http://www.cnblogs.com/skynet/archive/2010/09/22/1832911.html 写在前面 指针和引用形式上很好区别,但是他们似乎有相同的功能,都 ...
- 再议指针和引用的一些事情吧
关于指针和引用一直是学习C++的同学们争论的焦点,什么时候用指针,什么时候用引用,还有怎么引用数组,这么用指针访问数组,以及初始化的问题. 不过有一些文章我在很早就已经写过,但是由于当时时间不充分,自 ...
最新文章
- 插件框架实现思路及原理
- Google Chrome v48.0.2564.
- 主成分分析计算机如何实现,主成分分析(PCA)原理及R语言实现及分析实例
- 【C语言】创建一个函数,判断某一正整数是否为完数,并调用这个函数找出1000以内所有完数...
- power bi报表服务器_如何将Power BI Report Server报表嵌入ASP.Net Web应用程序
- 802.11无线信道详解
- Oracle用户权限分配的具体方法
- js替换问题replace和replaceAll
- 手机怎么更改ip地址
- 自动驾驶-毫米波雷达系列基础篇-测速原理
- 发那科机器人GI分配_发那科机器人IO信号的种类与常用信号的分配
- 原型模式,孙悟空都会用,猴毛变出的小猴子!
- 河南对口升学计算机考纲,2018年河南省对口升学考纲.
- 加菲猫语录精选74 中英俄三语版
- JavaScript 编程精解 中文第三版 九、正则表达式
- 小白思路理顺U-Net模型(keras)--预测部分
- python的数据与matlab互通:SciPy
- 【面试题】面试题Redis
- 计算机毕业设计Java中医保健网站(源码+系统+mysql数据库+Lw文档)
- 解决labelimg闪退