刘光《C++程序员不可不知的101条实用经验》_c++ 实战 经验-程序员宅基地

1.理解指针的本质
数组和指针的区别在于数组的长度是固定的,只能存取某一种元素,一旦创建就不允许添加其他的元素。而指针可以像索引一样指向数组的每个元素。
C++规定:存放地址的变量称为指针变量,变量的地址称为变量的指针。在32位系统中指针的宽度为32位(即4个字节)。
小心陷阱:
(1)一个指针变量定义了就要确保初始化,以防指针悬空或变成野指针
(2)如果一个指针变量被delete后,确保其被赋值为NULL,防止指针变量变为野指针
(3)如果一个函数的形参可以接受所有类型的指针,将此形参类型声明为void*型,如memcpy函数
(4)禁止使用void*指针操纵其所指向的对象,因为void*操作对象时无法确定对象的类型
(5)指针不运算“指针 + 指针”的算术操作,不能对void*进行算术操作,因为无法指定到底移动几个字节

2.论数组和指针的等价性
什么时候指针和数组等价:
①表达式中数组名被编译器当做一个指向该数组首元素的指针
②下标总是与指针的偏移量相同
③在函数形式参数声明中,数组名被编译器当做指向数组首元素的指针
请谨记:
(1)作为函数形参时,指针和数组等价,数组会退化为一个指向数组首元素的指针
(2)数组名被编译器当做一个指向该数组首元素的指针,而且是const指针
(3)无论采用a[i]或*(a+i)的形式访问,编译器在编译时均会改写成 *(a+i)指针形式访问

3.再论数组和指针的差异性
指针和数组的差异包括两个方面,第一个是两者含义上的区别,第二个是计算容量的差别
(1)数组对应着一块内存区域,而指针是指向一块内存区域,其地址和容量在生命期里不会改变,只有数组的内容可以改变。而指针指向的区域大小可以随时改变,而且指针指向常量时它的内容是不可以改变的。
(2)使用sizeof而已计算数组的字节数,但不能计算出指针所指内存的字节数,对指针做sizeof运算的结果始终是4
请谨记:
(1)数组标识一块区域,数组名称不占用内存;指针指向一块区域,指针会分配内存
(2)使用数组定义变量,声明此数组共其他地方使用时,一定要保持声明和定义一致,不能把数组声明为指针。

4.充满疑惑的数组指针和指针数组
数组指针为指向数组的指针,即是指向数组首元素地址的指针。如 int (*p)[5];
指针数组为可存放指针的数组,数组的每个元素均为指针,如 int *p[5];
int(*p)[5]表示一个指向二维数组的指针变量,该二维数组的列数必须为5。而指针数组int*p[5]表示一个指针数组,它的5个元素均为指针变量
请谨记:
(1)在数组指针中,声明的维数表示指针数组的元素数,而不是指针本身的元素数
(2)指针数组的每个元素均为指针,指向的数据类型为声明时的类型,声明时元素数既是指针数组的元素数
(3)数组指针可用于二维数组元素的操作,只要数组指针声明时的元素数和二维数组第二维元素数一样,二维数组名可直接赋值给数组指针

5.禁止以多态的形式处理数组
小心陷阱:
(1)在使用数组时,一定要保证保存的元素和使用的元素是相同类型的对象,否则会产生不可预期的结果
(2)数组作为函数的形参传给函数,在函数内部数组退化为指针,对此数组名进行的任何操作都会转化为对指针的操作
(3)通过基类指针删除一个由子类构成的数组,其结果未定义

6.防微杜渐,拒绝野指针
野指针不是NULL指针,而是指向“垃圾”内存的指针,在某些环境下使用野指针,程序可以正常运行,但并不表明程序是正确的
野指针的产生过程:
(1)指针变量未初始化。
(2)指针所指向的对象已经不存在了,编程人员误以为指针还是一个合法的指针
(3)指针操作超出变量的作用范围
预防野指针:
(1)声明指针时切记初始化
(2)指针释放后要置为NULL
(3)如果指针作为函数的输入参数时,在引用参数前首先对指针进行参数检查
(4)尽量使用引用替代指针

7.臭名昭著的空指针到底是什么
空指针不是任何变量的指针,同样空指针也不是野指针,每种指针都有一个空指针,而且每种变量的空指针也都不是此种变量的地址
请谨记:
(1)空指针不一定就是0,但必须是指向不能被变量分配到的地址,而NULL肯定是0
(2)赋值为空指针的变量,可确保变量不指向任何对象或函数。合理地使用空指针可有效避免内存泄漏,提高程序的执行效率

8.多维数组和指针
小心陷阱:多维数组作为形参时,第一维的长度其实并不重要,因为在计算下标值时用不到它,但第二维及以后各维必须声明,且各维的声明长度必须和实参传值时数组对应的各维长度保持一致,否则会导致不可预知的行为
请谨记:
(1)多维数组名和多重指针在任何时候都不等价。在C++中多维数组就是一维数组,知识数组中的每个元素又是一个数组。多重指针指的是指向另一个指针的指针
(2)多维数组的数组名的类型是数组指针,而不是多重指针

9.引用和指针的差异
小心陷阱:
(1)声明一个引用不是定义一个新的变量。仅表示该引用名是目标变量名的一个别名。它本身不是一种类型,因此不占用存储单元
(2)对引用求地址和对目标变量求地址是等价的
指针和引用的相同点:指针和引用都是地址的概念,指针只想一块内存,它所存储的内容是地址,而引用是某块地址的别名。两者都可通过间接方式实现数据操作(指针使用*和->,引用使用.),都可实现继承类的动态绑定。
指针和引用的不同点:指针是一个实体,而引用是一个别名,不占用存储空间。引用只能在定义时初始化,且初始化后不可以更改,指针可以任意时候初始化并再次赋值。引用不能用const和volatile关键字修饰,而指针可以。



版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/zrx1832/article/details/80602129

智能推荐

基于java springboot框架+微信原生开发框架+mysql数据库的校园求职招聘小程序系统 计算机毕业设计 微信小程序开发_招聘小程序功能框架-程序员宅基地

文章浏览阅读533次,点赞2次,收藏8次。1、管理员后台技术:Web前端使用vue框架进行开发后端使用java springboot框架进行开发数据库使用的是myql2、小程序用户端的技术:微信开发者语言:js+json+wxss+wxml3、项目整体采用的是mvc的思想模式进行开发。代码可读性高,便于理解。_招聘小程序功能框架

Rggplot2_下面关于ggplot2中,叙述错误的是a.ggplot2必须在rstidio平台上运行b.ggplo-程序员宅基地

文章浏览阅读1.2k次。文章转载自:https://www.cnblogs.com/nxld/p/6059603.html分析数据要做的第一件事情,就是观察它。对于每个变量,哪些值是最常见的?值域是大是小?是否有异常观测?ggplot2图形之基本语法:ggplot2的核心理念是将绘图与数据分离,数据相关的绘图与数据无关的绘图分离ggplot2是按图层作图ggplot2保有命令式作图的调整函数,使其更具灵活..._下面关于ggplot2中,叙述错误的是a.ggplot2必须在rstidio平台上运行b.ggplot2

ORB-SLAM3 ROS 运行_orbslam3 ros-程序员宅基地

文章浏览阅读9.7k次,点赞7次,收藏116次。为单眼,单眼+惯性,立体视觉,立体+惯性和RGB-D构建节点环境为:ROS Melodic 和 Ubuntu 18.04编译1、将源码中的 Examples/ROS/ORB_SLAM3 路径添加到ROS_PACKAGE_PATH环境变量中打开 .bashrc file:gedit ~/.bashrc把下面这行加到最下面一行,把“PATH”换成你放ORB_SLAM3的路径export ROS_PACKAGE_PATH=${ROS_PACKAGE_PATH}:“PATH”/ORB_SLAM3/_orbslam3 ros

sql优化-程序员宅基地

文章浏览阅读43次。1、带or的sqlunionunion all2、where中带max()的sqlnot exists

云南计算机专升本数据结构_云南专升本计算机专业考试科目有哪些?-程序员宅基地

文章浏览阅读720次。同学们应该要知道云南专升本计算机专业考试科目是哪些,毕竟关系到未来考试,根据公布的云南专升本政策来看云南专升本计算机专业考试科目是高等数学和公共英语和数据结构,下面跟随易学仕专升本网来看看吧!一、云南专升本可以报考哪些学校?云南可以报考的院校有很多,下面就和易学仕一起来看看云南专升本学校名单有哪些吧!云南师范大学,云南艺术学院,云南民族大学,西南林业大学,云南农业大学,昆明理工大学,楚雄师范学院,..._云南专升本数据结构是考什么

论文导读:实时语义分割网络BiSeNetV1和v2_语义分割bisenetv2-程序员宅基地

文章浏览阅读4.4k次,点赞2次,收藏27次。文章目录一、背景二、BiSeNetV1三、BiSeNetV2v1论文地址:BiSeNet: Bilateral Segmentation Network for Real-time Semantic Segmentationv2论文地址:BiSeNet V2: Bilateral Network with Guided Aggregation for Real-time Semantic Segmentation一、背景低水平的细节特征(spatial information 空间信息)和高水平_语义分割bisenetv2

随便推点

hvie sum 字符串_hive支持sql大全(7-8:字符串函数、集合统计函数)-程序员宅基地

文章浏览阅读627次。七、字符串函数1. 字符串长度函数:length 语法: length(string A) 返回值: int 说明:返回字符串A的长度 举例: hive> select length('abcedfg') from lxw_dual; 72. 字符串反转函数:reverse 语法: reverse(string A) 返回值: string 说明:返回字符串A的反转结果 举例: hive&g..._hive sql 字符串运算

python整数溢出问题_Python多个整数溢出漏洞-程序员宅基地

文章浏览阅读419次。BUGTRAQ ID: 30491CVE(CAN) ID: CVE-2008-2315,CVE-2008-2316,CVE-2008-3142,CVE-2008-3143,CVE-2008-3144Python是一种开放源代码的脚本编程语言。Python中存在多个整数溢出漏洞,可能允许恶意用户导致拒绝服务或入侵有漏洞的系统。1) stringobject、unicodeobject、buffer..._该漏洞可以通过人整数转换触发 python core 的 过载,以触发拒绝服务

python读取txt数据写入excel_python读txt写入excel-程序员宅基地

文章浏览阅读8.8k次,点赞3次,收藏22次。在公司接到一个任务,从txt中抓取数据写入excel,txt格式固定,并且有多个txt文件先安装excel的读写支持,参考:https://www.cnblogs.com/cllovewxq/p/5363636.html就是下载xlrd和xlwt,进入该目录分别运行python setup.py install,这个程序只用到写入操作--xlwt思路: 逐个打开txt文件,抓_python读txt写入excel

centos7镜像在虚拟机上安装centos7详细教程_虚拟机安装centos7安装教程详细-程序员宅基地

文章浏览阅读7.8k次,点赞4次,收藏15次。有许多人在安装虚拟机这方面不会操作,在安装过程中经常出现问题,所以今天出一期下载安装虚拟机的教程一、前期安装准备二、下载centos7镜像文件三、安装centos7四、打开VMware第一步:在VMware新建一个虚拟机第二步:..._虚拟机安装centos7安装教程详细

实现一个java版本的redis(1)——实现一个内存型KV存储_java实现kv数据库-程序员宅基地

文章浏览阅读657次。前排说一下,这是一个十分简陋的KV内存数据库,作为笔者实现redis的第一章,大佬可以走了,因为真的很简陋。仅供学习。心血来潮,看到了开源项目godis,但自己对go又没有很熟悉,一开始去看了godis,一头雾水,索性想到为什么不用java来实现一个redis呢?说干就干​ 第一步,我们来实现一个简单的运行在单机的内存型的KV数据库,严格来说这不是redis,和redis差了十万八千里。就是将一个字典,通过网络的方式提供了出去。但毕竟第一步,我们就来实现一个简单一点的(十分的简陋)。​ 我们主要来实_java实现kv数据库

URL处理几个关键的函数parse_url、parse_str_httpurl.parse(url);-程序员宅基地

文章浏览阅读745次。parse_url()该函数可以解析 URL,返回其组成部分。它的用法如下:array parse_url(string $url)此函数返回一个关联数组,包含现有 URL 的各种组成部分。如果缺少了其中的某一个,则不会为这个组成部分创建数组项。组成部分为:scheme - 如 http host - 如 localhostport - 如 80user pass _httpurl.parse(url);