• 5.1 引用
  1. 引用可以看做是对象的别名,可以通过引用来操作对象,要注意,引用在声明时要初始化。
int a=10;
int&m=a;
int*p=&a;
int*&pa=p;

例子1:

char*p="abc";
char*q="def";
swap(p,q);
cout<<p<<","<<q<<endl;

输出:abc,def

因为,指针传入函数,函数内部会临时分配临时变量用于存储传进来的值,在函数返回后,临时变量销毁,不会对指针有任何操作。

若是要解决这个问题,则需要传递指针引用。

voidswap(char **,char**);

swap(&p,&q);

即可。

例子2:

float f=5;
floatf1()
{return f;
}float&f2()
{return f;
}
voidmain()
{float c=f1();float &d=f2();float e=f2();float &h=f1();//error
}

其中,main 函数中第二行第三行效果相同,但是第四行会出现错误。提示为:非常量引用的初始值必须为左值。

这是因为 ,在函数内部,为全局变量f,会自动赋给临时变量,这就相当于h是对临时变量temp的引用,而临时变量用后会被销毁。

还有一种引用是常量引用,形如 constint &p=a;在这种情况下,不允许通过引用p修改变量a 的值,达到安全的目的。常量引用的引用对象可以是变量,

但是如果引用对象是常量,那么引用一定要为常量引用,即:

constint a=5;
int&p=a;//error
constint &p=a;//correct

例子3:

指针与引用的区别:

1、初始化要求不同。  引用在创建的同时必须初始化,而指针在创建的同时,可以不必初始化。

2、可修改性不同。    引用一旦确定,就不能再更改,而指针可以重新指向其他对象。

3、不存在NULL的引用。引用必须指向明确的对象,而指针则可以为空,也可以指向任意对象。

4、测试的区别。          引用不为空,所以测试是不需要验证其有效性,但是指针则不一定,所以需要验证其合法性。

5、应用的区别。      引用适用于指向对象后不需要更改的场景中,而指针适用于需要变换指定对象情况。

补充:指针由于存在隐患,所以安全性不如引用。

5.2 指针基础

例子4:

指针的定义声明:

int*p;           定义一个整型指针
int **p;         定义一个指向指针的指针
int*p[10];       定义一个有十个指针的指针数组
int(*p)[10];     定义一个有十个整数的数组指针
int*p(int a);    定义一个形参为整型的函数指针
int*p[10](int a);定义一个元素为形参是整型的函数的数组指针

例子5:

指针的比较:

void main()
{char str1[]="abc";char str2[]="abc";const char str3[]="abc";const char str4[]="abc";const char *str5="abc";const char *str6="abc";char *str7="abc";char *str8="abc";cout<<(str1==str2)<<endl;cout<<(str3==str4)<<endl;cout<<(str6==str7)<<endl;cout<<(str5==str6)<<endl;cout<<(str7==str8)<<endl;}

输出为:0 0 1 1 1

这是因为“abc”是在栈中分配,是以\0结尾的字符串,所以str1和str2是不同的地址,对于str3和str4,const只是说明不可更改,不改变存储位置和方式,所以不同;

而指针str5,6,7,也在栈中分配,都指向“abc”,但是“abc”是放在数据区中的,是同一块区域。

对空指针进行内存读取会产生错误。如int*p=0;int a=*p;

注意 常量指针和 指针常量的区别: 常量指针是指向常量的指针,指针常量是类型为指针的常量。

5.2 this指针

在C++中,对象的this指针并不是对象的比部分,不会影响sizeof的结果。this 指针的作用域是累的内部,在累的静态成员函数中访问累的非静态成员时,编译器会自动将对象地址作为隐含参数传递给函数。

也就是说,没有this指针,编译器也会在运行的时候,为对象分配一个this指针。他作为非静态成员函数的隐含参数,对各个成员均可以通过this访问。

例如 : date.setMonth(9);在this指针的帮助下,可以转换为:

setMonth(&date,9);

this 指针的使用情况如下:

一种是在类的非静态成员函数中返回类对象本身的时候,直接使用return *this;二是当参数名和成员变量名相同时,用来区分二者,如this->n=n;

注意:this指针是存在于属于类的非静态成员函数中,而静态成员函数不属于类,所以不存在this指针。

例子6:

指针数组 与数组指针:

void main()
{char*str[]={"welcome","to","Fortemedia","Nanjing"};char **p=str+1;            //1str[0]=(*p++)+2;            //2str[1]=*(p+1);              //3str[2]=p[1]+3;              //4str[3]=p[0]+(str[2]-str[1]);//5cout<<str[0]<<","<<str[1]<<","<<str[2]<<",'<<str[3]<<endl;
}

输出为:空,Nanjing,jing,g

1行后,p指向了str[1],即“to”;

2行后,*p是指向"to"的,+2后,就指向了“to”的末尾"\0",也就是为空,然后p自增,指向了Fortemedia字符串,也就是str[2];

3行后,p+1指向Nanjing,所以str[1]为"Nanjing";

4行后,先计算等号右边,p[1]是指向“Nanjing”的,再移动三个位置,就是"jing",所以str[2]="jing",由于p此时也是指向str[2]的,所以p的内容也发生了变化,这一步的操作相当于把str[2]的子串赋给了str[2];

5行后,由于此时p指向了"jing",str[2]-str[1]=3,所以p右移三个位置的值就是str[3]的值,也就是g;

5.4 函数指针和指针函数

指针函数本身是一个函数,只是他的返回类型是指针,定义形式为:type *name(parameter){};

函数指针本身是一个指针,只是其类型为函数类型

5.5 野指针

野指针有两种:

1、没有初始化,默认值是随机的。

2、被free或delete后没有置为NULL,即悬垂指针。

new/delete和 malloc/free:

对于非内部数据类型的对象而言,对象在小王仟要自动执行析构函数。由于malloc/free函数是库函数而不是运算符,不在编译器控制权限内,不能够把执行构造函数和析构函数的任务强加给malloc/free函数是库函数而不是运算符,不在编译器控制权限内,不能够把执行构造函数和析构函数的任务强加给malloc/free

只能使用new/delete函数。

例子6:

char* get()
{char str[]="welcome";return str;
}
void main()
{char *p=get();cout<<p<<endl;}

输出 p可能会乱码!!!

void get(char *p)
{p=(char *)malloc(100);
}
void main()
{char *str=NULL;get(str);
}

str 并不会指向分配的存储空间,依然为NULL,而对应内存没有指针可以指向,这就会导致内存泄露。

例子7:

内存的分配方式:

内存分配一共有三种,分别是静态存储区、栈、堆的内存分配;

1、静态存储区分配内存。编译器在程序编译阶段就已经将内存分配好,并且在程序运行的整个过程中都一直存在。

2、栈上的内存分配。在执行函数时,函数内局部变量的存储单元可以在栈上创建,函数结束时这些存储单元自动被释放。处理器的制定集中有关于栈内存分配的运算,因此效率很高,但是分配的内存容量有限。

3、在堆上分配内存。也成为内存的动态分配。程序在运行的时候用malloc或new运算符申请任意大小的内存,程序员要用free函数或delete运算符来释放内存。动态内存分配很灵活,但问题也很多。

5.6 指针和句柄的区别

windows环境中,句柄是用来表示i项目的,这项目包括:

模块(module),任务(task),实力(instance),文件(file),内存块(blockofmemory),菜单(menu),控制(control),字体(font),资源(resource),包括图标,光标,字符串等,GDI对象,包括位图,画刷,原文件,掉色斑,画壁,区域以及设备描述表。

windows是以虚拟内存为基础的操作系统。在这种操作系统下,windows内存管理器在内存中来移动对象,从而满足各种应用程序的内存需要。对象被移动意味着他的地址发生变化。由于地址变化,windows专门为各应用程序留出一些内存储地址,

专门用来等级个应用对象在内存中的地址变化,而这些地址(存储单元)的地址本身是不变的。windows内存管理器在内存中移动对象后,把对象的新地址告知句柄地址来保存。这样只需要知道句柄的地址就可以间接的知道对象在内存中的地址,

这个地址在对象装在的时候由系统来分配,当系统卸载是有释放给系统。

因此,windows程序并不是通过物理地址来表示内存块、文件、任务或动态装入模块的,相反,windowsAPI给这些项目分配确定的句柄,并将句柄返回给应用程序,然后通过句柄来进行操作。

在windows变成中会大量使用句柄,HINSTANCE,HBITMAP,HDC(设备描述句柄),HICON图标句柄,还有一个通用句柄handle。c

程序执行的顺序是:

句柄地址(稳定)-->记载对象在内存中的地址-->对象在内存中的地址(不稳定)-->实际对象

每次程序重新启动后, 分配的句柄,并不一定是原来的句柄,很多情况下是不一样的。

不同之处:

1、句柄是一个复杂的结构,并且可以与系统有关,例如线程的句柄,他可以指向一个类或者结构,并且和系统有很密切的关系,当一个线程由于不可预料的原因二终止的时候,系统就可以返回他所占用的资料,如CPU,内存等

反之,句柄的某些项是与系统进行交互的。

2、指针也可以指向一个复杂的结构,但是通常是由晕乎定义的,所以必要的工作要由用户来完成,特别是删除部分。

第五章结束

C/C++软件工程师就业求职手册学习笔记---第五章相关推荐

  1. 《.NET 软件工程师就业求职手册》 - 书摘精要

    (前言) 作为一名.NET技术开发人员,只要基础扎实,完全可以通过不断学习,轻松游走于各个 .NET 应用领域.   (P6) 经验丰富的应聘者,其简历往往只有一页.   在受教育经历方面,只需要填写 ...

  2. 《.NET 软件工程师就业求职手册》(转)

    (前言) 作为一名.NET技术开发人员,只要基础扎实,完全可以通过不断学习,轻松游走于各个 .NET 应用领域. (P6) 经验丰富的应聘者,其简历往往只有一页. 在受教育经历方面,只需要填写最高层次 ...

  3. Programming Entity Framework-dbContext 学习笔记第五章

    ### Programming Entity Framework-dbContext 学习笔记 第五章 将图表添加到Context中的方式及容易出现的错误 方法 结果 警告 Add Root 图标中的 ...

  4. 《Go语言圣经》学习笔记 第五章函数

    <Go语言圣经>学习笔记 第五章 函数 目录 函数声明 递归 多返回值 匿名函数 可变参数 Deferred函数 Panic异常 Recover捕获异常 注:学习<Go语言圣经> ...

  5. 《Android深度探究HAL与驱动开发》学习笔记----第五章

    第五章 搭建S3C6410开发板的测试环境 开发板是开发和学习嵌入式技术的主要硬件设备. 主要学习了搭建S3C6410开发板的测试环境.首先要了解到S3C6410是一款低功耗.高性价比的RISC处理器 ...

  6. 2022 最新 Android 基础教程,从开发入门到项目实战【b站动脑学院】学习笔记——第五章:中级控件

    第 5 章 中级控件 本章介绍App开发常见的几类中级控件的用法,主要包括:如何定制几种简单的图形.如何使用几种选择按钮.如何高效地输入文本.如何利用对话框获取交互信息等,然后结合本章所学的知识,演示 ...

  7. 《吕鑫:VC++6.0就业培训宝典之MFC视频教程》学习笔记 -- 第五章对话框组合

    章节内容: 5.1 模式对话框和非模式对话框 5.2 账户登录权限管理 5.3 录入对话框和员工信息管理 5.4 完善员工信息管理对话框 5.5 系统对话框的使用 5.6 完成所有系统对话框的使用方法 ...

  8. AE学习笔记——第五章:效果预设和渲染导出

    目录 一:效果与预设的应用 (1)效果的运算顺序 (2)效果的应用 (3)动画预设的使用 二:渲染和输出 (1)使用Adobe Media Encoder渲染 (2)使用AE渲染 A:.avi格式 B ...

  9. 操作系统学习笔记 第五章:文件管理(王道考研)

    本文章基于网课: 2019 王道考研 操作系统 考试复习推荐资料:操作系统复习总结 - 百度文库 (baidu.com) 需要相关电子书的可以关注我的公众号BaretH后台回复操作系统 第一章:操作系 ...

  10. 第一行代码学习笔记第五章——详解广播机制

    知识点目录 5.1 广播机制 5.2 接收系统广播 * 5.2.1 动态注册监听网络变化 * 5.2.2 静态注册实现开机广播 5.3 发送自定义广播 * 5.3.1 发送标准广播 * 5.3.2 发 ...

最新文章

  1. 2021年大数据Spark(十四):Spark Core的RDD操作
  2. 设置float后,后面的元素位置问题。
  3. 特征工程(feature engineering)是什么?特征工程(feature engineering)包含哪些方面?
  4. redhat安装wine教程_可能是最漂亮的国产Linux,U盘安装DeepinLinux 深度操作系统
  5. 详解log4j2(下) - Log4j2在WEB项目中配置
  6. 程序员的思维修炼》读书笔记
  7. Linux下发生段错误时如何产生core文件-转
  8. 我的第一个字典-Dictionary
  9. ImportError: cannot import name 'imresize'
  10. 【Clover】服务器环境中通过Clover boot引导黑群晖DSM(Linux)+Win系统的解决方案与常见bug排查
  11. FIT2CLOUD飞致云旗下多云管理平台完成华为FusionCompute兼容性测试
  12. 维基百科-D3.js
  13. Reactor 反应堆
  14. Elasticsearch Index Lifecycle Management (ILM)
  15. Maven:A cycle was detected in the build path of project 'xxx'. The cycle consists of projects {xx}
  16. 怎么把中文用户名改成英文?
  17. 华容道 java_华容道 ( java)
  18. 为什么建议你来公司线下面试
  19. Hexo博客SEO优化-百度收录
  20. notepad++使用方法

热门文章

  1. The following method did not exist: kotlin.collections.ArraysKt.copyInto([B[BIII)[B
  2. python 金融知识图谱_从零搭建金融证券知识图谱-Part1
  3. 毕业设计论文-基于matlab的车牌识别系统
  4. 数字信号传输理论 Nyquist准则
  5. JS中flag使用场景之一
  6. 液晶12864图像取模方法
  7. 飞鱼星路由器如何限制外网访问服务器网站,飞鱼星路由器如何限制禁止指定IP上网...
  8. vue 弹框只出来一半,另一半白屏遮挡了
  9. 东北大学——应用数理统计——笔记
  10. Excel表格中无法中间插入新行列! 提示:在当前工作表的最后一行或列中,存在非空单元格,解决方案