【C++】C++自学旅程(5):指针和引用
学C语言的时候,指针一直是一个让人头大的东西,懂,但是不会用,还好现在慢慢会了,还好C++的指针还是跟C基本相同,还好如此我就只用记一些不同的东西了:)
一、无名变量(动态变量)
可以用new来创建一个无名变量,这种变量没有标识符,如:
int *p = new int;
可以在动态创建的同时指定初始化列表,如:
double *pdouble;
pdouble = new double(26.7);
之后这个变量就通过指针来间接访问,如:
cin>>*p;
cout<<*p;
int c = *p+13;
......
一般情况下,称使用new运算符创建的变量为动态变量,因为这些变量要在程序运行期间动态创建和销毁。
动态创建的变量要动态销毁,用delete关键字,如:
delete p;
酱紫就删除了指针p指向的无名空间。
接下来,谁来告诉我这玩意有什么用?
二、const修饰指针
由前面的学习可以知道,const关键字可定义常量,如
const int a=10;
是不能改变的。当const修饰指针,也是不能改的意思,不过他俩结合会有新的火花:
①指向常量的指针
若把const放在声明变量的最左边,如:
1 int i=0; 2 int j; 3 const int *p = &i; 4 *p = 3; //错误!不能通过p修改所指内容 5 i=2; //可以 6 p=&j;
可以发现,酱,不能再通过p修改所指内容,仅此而已,p所指的东西可以通过别的途径更改,p的指向也可以改。
②指针常量
1 int * const p = &i; 2 p=&j; //错误,指针不能修改指向 3 *p=2; //可以
如果要指针指向固定,且不能通过该指针修改所指值,则这样:
const int * const p = &i;
三、引用
引用就是给一个变量取个别名,如:
int a; int &b = a;
相当于a有了另一个名字b,只是另一个名字,系统并没有分配另外一个空间给b。用引用可以减少空间消耗。
需要注意的有:引用声明时必须指定对哪个变量引用,即必须初始化;别名不能再被引用;不能建立数组的引用,因为数组是元素的集合。
下面用大篇幅来说说引用的应用:
①引用作为函数参数
函数参数传递有三种方式:值传递、地址传递和引用传递。下面来看一个例子程序,来看看引用传递怎么用:
1 //引用作为函数参数的引用传递方式 2 #include<iostream> 3 using namespace std; 4 void fun1(int); 5 void fun2(int&); 6 7 int main() 8 { 9 int a=2; 10 cout<<"实参a的地址是:"<<&a<<endl; 11 12 fun1(a); 13 cout<<"主调函数中a="<<a<<endl; 14 15 fun2(a); 16 cout<<"主调函数中a="<<a<<endl; 17 18 return 0; 19 } 20 21 void fun1(int x) 22 { 23 cout<<"值传递中,形参x的地址是:"<<&x<<endl; 24 x=10; 25 cout<<"在fun1函数内部x="<<x<<endl; 26 } 27 28 void fun2(int& x) 29 { 30 cout<<"引用传递中,形参x的地址是:"<<&x<<endl; 31 x=10; 32 cout<<"在fun2函数内部x="<<x<<endl; 33 }
运行结果如下:
实参a的地址是:0x68feec 值传递中,形参x的地址是:0x68fe90 在fun1函数内部x=10 主调函数中a=2 引用传递中,形参x的地址是:0x68feec 在fun2函数内部x=10 主调函数中a=10
可以发现,fun1没有用引用传递,fun1中定义的局部变量x的地址与实参不同,改变形参的值当然也无法对实参a起到作用。而在fun2中,x并不是新定义的局部变量,而是对实参a的引用,所以fun2中的x就是a,地址也相同,那么对引用量x进行变化,实参当然受影响。
总结一下引用传递的优点或者特点:
- 引用传递和指针传递效果一样,被调函数中对引用的操作,实际上就是对实参的操作。
- 使用引用传递,并没有产生实参的副本,而是直接对实参操作,比较节省内容,因此在数据量大时,用引用比一般传递参数的效率和所占空间都好。
- 引用传递较指针来说,优点同样有节省空间,因为指针仍然需要为形参开辟空间,且引用传递在使用起来比指针方便(不用经常使用*或&符号)。
②常引用
如:
const int &b=a;
这样就不能通过引用对值进行变更了,更加安全咯~据说能使用const的情况下尽量使用const,虽然我现在还不能完全理解这样做的苦衷。
③引用作为返回值
要用引用作为返回值类型时,函数得这么定义,如:
int &fun(形参列表)
相信用起来没有什么问题吧!~
但是要注意的是:不能返回局部变量的引用,因为局部变量被灭的,引用就会“无所指”,程序会进入位置状态;);也不能引用new定义的动态变量;可以返回类成员的引用,但最好用const。
之后再继续学吧,好晕啊@~@!
四、动态数组
原来之前学的动态变量 new/delete 语句是用在这里啊!申请动态数组如下:
数据类型 * p = new 数据类型[n];
//其中n可以为变量
相当于p指的是这个空间的收地址,跟数组一样咯,但是可以自由控制n的大小了。用完后删除:
delete []p;
特别注意删除语句的形式:[]p!要加方括号在指针前面。
温馨提示:使用了new,指针p就不要更改了,免得出现错误。
学到这个,突然回忆起了在C语言的malloc/free函数,C++也是有这个函数的。所以new/delete和malloc/free有什么不同呢?好奇搜索了一下,原来这是百度的一个笔试题。。。
《百度笔试题:malloc/free与new/delete的区别》by CSDN hackbuteer1
真是深刻感受到知识都来源于生活,小东西也要注意,说不定哪天就派上了大用场。。。不过,不同点第一条(操作对象不同)现在还看不懂。
五、其他指针复习
①函数指针
指向函数的指针。形如:
int (*p)(int,int,int);
p=max;
这样,p就指向max了。圆括号不能少!
②指向指针的指针
指的对象还是指针。
int *p=&x;
int **p=&p;
③指针数组
数组元素为指针类型的数据。
int *p[5];
P.S. int *p[5] 和 int (*p)[5] 辨析
前者,p优先与[]结合,所以p是一个指针,指向一个有五个数据的数组。
后者是指针数组,数组元素为指针。
数组中举结了@~@
转载于:https://www.cnblogs.com/HappyCtest/p/5176931.html
【C++】C++自学旅程(5):指针和引用相关推荐
- C++指针与引用的区别
(1)指针是一个变量,本身占有内存,内存中存储的是所指向对象的地址.引用是内存的别名. (2)指针可以通过解引用的方式,取出所指向内存中的值.引用没有解引用. (3)指针可以先定义,然后在后面初始化. ...
- C++:const的使用(普通常量、指针、引用)
const声明的是常量,常量基本上只能读不能写.其实x也是能写的,但他只是在x初始化的时候完成了写操作. int main() {const int x=4;//x是const int型.在初始化时写 ...
- 指针,引用之间的关系
在这之前不清楚引用,和指针有怎样的关系,但今天一个例子让我们知道了指针和引用在程序中怎样运用 在这个地方我们是初始化初始化一个顺序表, 我们在主函数中是定义一个结构体的变量: SqList L; 然后 ...
- C++ demo:文本搜索以及'指针的引用'的思考
功能: 本程序允许用户在一个给定的文件中查询单词.查询结果是单词在文件中出现的次数及其所在行的列表.如果一个单词在一行中出现多次,此行只列出一次.行会按照升序输出,即第7行会在第9行之前显示. 思路: ...
- C++的常量、指针、引用
一.C语言的常量是可以通过地址进行修改的:而C++的常量是不可修改的,且在定义的时候必须初始化! 可引用常量的地址,但只是临时地址: const int a = 10 ; int *b = (int* ...
- C++编程进阶4(C++中的强制类型转换运算符、不要返回自定义类内部成员的指针,引用和迭代器)
十五.C++中的强制类型转换 C语言中的强制类型转换方式有两种 T i = (T)exp; T i = T(exp); 这两种方式没有差别,C++中也支持这两种方式,但是和C++中的强制类型转换运算符 ...
- C++知识点2——指针、引用基础
引用: 1.引用就是对象或变量的别名,但引用不是对象或变量 int a=10; int &b=a; 这里面,b就是变量a的另一个名字,对b操作就是对a操作,对a操作,b也会变化 void te ...
- c++值传递,指针传递,引用传递以及指针与引用的区别
值传递: 形参是实参的拷贝,改变形参的值并不会影响外部实参的值.从被调用函数的角度来说,值传递是单向的(实参->形参),参数的值只能传入, 不能传出.当函数内部需要修改参数,并且不希望这个改变影 ...
- 【C++ 语言】引用 ( 引用简介 | 指针常量 | 常量指针 | 常引用 | 引用参数 | 引用 指针 对比 )
文章目录 I . 引用概念 II . 引用声明 III . 引用 地址 内存 分析 IV . 常引用 V . 引用作为参数 VI . 引用 与 指针 对比 I . 引用概念 C++ 对 C 扩充 : ...
- 返回函数局部变量的指针和引用
返回函数局部变量的指针和引用是不允许的,容易造成野指针.不管是通过返回值或者出参返回局部变量的指针都是不允许的. 但针对各种情况,可以具体研究一下返回函数指针和引用的异常情况. 例子1: #inclu ...
最新文章
- 100个必会的python脚本-Python 经典算法100及解析(小结)
- Show Attend and Tell的实现代码中的python知识学习
- java生成excel文件
- MAC下快速打开指定目录
- dotnet 找不到控制生成器_真的有自媒体原创文章生成器吗?
- python棋盘放米问题_Python基于回溯法子集树模板解决马踏棋盘问题示例
- mysql慢查询日志分析工具(python写的)
- centos安装cmake
- CSR8610 入门操作(BlueSuite 2.6.2和CSRXX_ROM_ConfigTool_3.0.64使用)
- 三分钟细数 el-form 表单校验的坑点,前车之鉴,可助你避坑
- 电脑只有一个c盘怎么办?看我怎么一招解决!
- EF(一) -- EF简介
- 杭电操作系统实验三--- 实现模拟shell(arm架构华为云)
- T1677 [USACO Open08]农场周围的道路——递归
- 洛谷 P2440 木材加工(二分,含边界处理的笔记)
- 信息学奥赛一本通 1354:括弧匹配检验
- git branch命令解析
- 通过url路径传递参数
- 计算机科学与技术考研双非院校排名,ESI工科小校较好新排名,两所双非院校冲进世界500强!...
- rtmp2flv rtmp直播转httpflv工具
热门文章
- 快速排序的时间复杂度分析
- es Root mapping definition has unsupported parameters解决方法
- STM32开发 -- UART应用层通信协议分析
- Nand Flash基础知识与坏块管理机制的研究
- android中占容器比例,Android中的容器
- matlab cep,【CEP】重构和改进HelloInsightObservable
- linux下线程不需要死循环么,Linux多线程程序死循环问题调试
- python安装sqlite3_Python安装sqlite3
- 一篇演讲 By 浙江大学数学系主任刘克峰
- [CODEVS 1285] 宠物收养所