• C++篇为本人学C++时所做笔记(特别是疑难杂点),全是硬货,虽然看着枯燥但会让你收益颇丰,可用作学习C++的一大利器

六、指针

(一)指针规则

  1. 两个指针不能进行加法运算,因为指针是变量,其值是另一个变量的地址,故两地址相加没意义,但可以用一个空指针赋值给某个指针变量,值为NULL

  2. 如果两个指针是指向同一类型的两个指针,则两个指针之间可以进行相减(实际是所指向对象的相减)和关系、运算

  3. 无论任何指针在32位系统中是4字节 64位系统中是8字节

  4. 初始化为NULL的类指针,可以安全的调用不涉及类成员变量的类成员函数而不会出错

  5. 初始化指针时所创建的字符串常量被定义为只读。如果试图通过指针修改这个字符串的值,程序就会出现未定义的行为,例:char* s="AAA";

  6. 指针本身存于栈中

  7. 当free释放内存之后,指针还指向原来的那块地址,需要我们设置 p = NULL;如果不手动设置 p = NULL,此时P就变成了野指针;野指针产生原因:

  8. 声明的指针未被初始化,指针默认值随机产生。创建指针应该将其初始化为NULL或者指向某一内存。

  9. free和delete掉的指针未重置为NULL,free后的指针仍指向该内存,但该内存已变为垃圾内存。

  10. 空指针(值为0)不指向任何实际的对象或函数,反过来说对象或函数的指针也不可能为空指针

  11. C++的指针有数据指针,函数指针,数据成员指针,成员函数指针四种,后两种是C++专门为类扩展的称为成员指针

  12. 不要试图通过改变形参指针变量的值而使实参指针变量的值改变,因为实参变量和形参变量之间的数据传递是单向的

当实参是地址(如&a),传递的是地址,则仍然是传值方式,当实参是变量名,而传值的是变量的地址,才是传址方式

  1. 在使用一个指针之前,必须先赋初始值

(二)指针使用

  1. 如果p=&a,p+4指的是p的值+4,也就是a+4(ASCALL码+4),因此为e;(p+4)指的是首地址后移4位再取值

  2. int &i; /没有这种语法/ int &i; /没有这种语法/

    3. 定义:

① void f() ; // 无返回值

② void* f(); // 返回一个无类型指针

③ int (p[10])(int) // 定义了一个指针数组,数组元素都是int (*p)(int *)的函数指针,所以p是一个函数指针数组

④ 64 位情况下:

(1) char ** p[4] // 表示char**数组返回 4 * 8 = 32

(2) char * (* p)[4] // 表示指向 char* 数组的指针返回8

(3) char (**p)[4] // 表示指向 char数组的指针的指针返回8

 指针前加&是什么意思

(1) 在定义时使用,如

int *a;

int * &p = a;

这种是C++中的引用(引用全部是const类型),p本身不占用内存空间,只是a的一个别名,对p的访问完全等同于对a的访问。

(2) 在非定义时,指针前加&表示取指针的地址。如

int * a;

int **p = &a;

这里a本身是指针变量,每个变量都有自己的内存空间,对变量做&操作,可以取得这个空间的首地址。于是&a就是取a的地址赋值给p,这样,*p就等同于a

 函数指针:void (*f)(); // 声明一个指针,指向void x()类型函数,定义函数指针需要打括号

(1) 函数指针所指向的函数,返回值类型,形参列表必须完全匹配

⑦ char (*p)[16]:p是指向长度为16的字符数组的指针(括号中有指针表示,这个变量就是指针类型)

⑧ char p[16]:由于[ ]比优先级高,因此p先与[4]结合,形成p[4]的数组的形式。然后与p前面的“ * ”结合,“ * ”表示此数组是指针类型的,故为指针数组

  1. 指针和void*可以相互转化(结合笔记P28void型指针)

  2. 文件指针指向的是一块内存区域,这块区域存储着打开的文件的相关信息,包括文件读取指针当前位置、文件读取缓冲区大小等信息,并不是指向文件的。fscanf是从文件中格式化读取,fprintf才是向文件中格式化写入

  3. 指针允许0值常量表达式,例:int *P;P=0;

(三)const与指针

  1. 口诀:左定值,右定向。 const在的左边不能改变字符串常量的值;const在的右边不能改变指针的指向

  2. 把一个const对象的地址赋给一个非const对象的指针变量是错误的,但反之可以

  3. int const p // 类型为int const,此时为常指针其指向不能改变

const intp // 类型为const int,此时为指向常量的指针变量,不能通过P修改其指向的对象的值

(四)数组与指针

  1. int a[ ] = { 2,4,6,8 },*p=a;(注意与上面的二维数组进行区分)

  2. 数组名为常量指针,只能在定义是初始化,不可把其当作普通指针单独赋值或出现在左值和某些算术运算中,只有作为参数传递时才退化为普通指针
  3. 两个指针指向同一个数组的元素则可以进行比较,不指向同一数组则比较是无意义的
  4. *(a+1)[5] 这种表示不正确,因为就像int a[5];声明一个长度为5的int类型数组。这里,a[5]只是一种声明的写法,这里声明的变量是a,不是a[5]

(五)函数与指针

  1. Int (*P)(int a); // 定义函数指针变量;可以将函数的地址(函数名)赋值给函数指针变量。但要求函数指针变量与指向函数必须有相同的返回类型、参数个数、参数类型

(六)结构体与指针

  1. 想访问用new 所开辟的结构体空间,无法直接通过变量名进行,只能通过指针进行访问

  2. 如果要建立一个动态链表,必须从第1个结点开始,逐个的开辟结点并输入各结点数据,通过指针建立起前后相连的关系

C++篇:第六章_指针_知识点大全的更多相关文章

  1. C++第四篇--重载_指针_引用

    C++第四篇--重载_指针_引用 1. 基础知识 重载:函数名相同,根据参数不同(类型.数量.顺序不同)调用同名函数 指针和引用:引用就是别名,引用时必须初始化,引用你定义的变量. int a; in ...

  2. Java语言程序设计(基础篇) 第六章 方法

    第六章 方法 6.2 定义方法 1.方法的定义由方法名称.参数.返回值类型以及方法体组成. 2.定义在方法头中的变量称为形式参数(formal parameter)或者简称为形参(parameter) ...

  3. Java编程基础篇第六章

    构造方法 一:概念: 给对象的数据(属性)进行初始化 二:特点: a.方法名与类同名(字母大小写也要一样) b.没有返回值类型 c.没有具体的返回值 return 三:构造方法重载: 方法名相同,与返 ...

  4. 鸟哥的Linux私房菜:基础学习篇 —— 第六章笔记

    1.下面这些就是比较特殊的目录,得要用力的记下来才行: . 代表此层目录 .. 代表上一层目录 - 代表前一个工作目录 ~ 代表“目前使用者身份”所在的主文件夹 ~account 代表 account ...

  5. 刘汝佳 算法竞赛-入门经典 第二部分 算法篇 第六章 1(Lists)

    127 - "Accordian" Patience 题目大意:一个人一张张发牌,如果这张牌与这张牌前面的一张或者前面的第三张(后面称之为一位置和三位置)的点数或花式相同,则将这张 ...

  6. 刘汝佳 算法竞赛-入门经典 第二部分 算法篇 第六章 2(Binary Trees)

    112 - Tree Summing 题目大意:给出一个数,再给一颗树,每个头节点的子树被包含在头节点之后的括号里,寻找是否有从头节点到叶子的和与给出的数相等,如果有则输出yes,没有输出no! 解题 ...

  7. 明解C语言 入门篇 第六章答案

    练习6-1 /* 求两个整数中的最小值 */ #include <stdio.h> /*--- 返回三个整数中的最小值 ---*/ int min2(int a, int b) { int ...

  8. ArcGIS for Desktop入门教程_第六章_用ArcMap制作地图 - ArcGIS知乎-新一代ArcGIS问答社区

    原文:ArcGIS for Desktop入门教程_第六章_用ArcMap制作地图 - ArcGIS知乎-新一代ArcGIS问答社区 1 用ArcMap制作地图 作为ArcGIS for Deskto ...

  9. 《mysql必知必会》学习_第六章_20180730_欢

    第六章<过滤数据> P35 1. select prod_name,prod_price from products where prod_price=2.5; 2.select prod ...

  10. 从IL角度彻底理解回调_委托_指针

    从IL角度彻底理解回调_委托_指针 目录 从IL角度彻底理解回调_委托_指针 1.创作此文的背景 1.1.委托能帮助代码更好地封装 1.2.委托能随时随地更方便地运行其他类中的方法 1.3.委托非常适 ...

随机推荐

  1. 题解 hdu 1269 迷宫城堡

    找点图论练习题写,发现hdu又寄了,那就发到blog里吧. 思路:tarjan缩点判断DAG中点数是否为1.若是,则该图为强连通图. //produced by miya555 //stupid mi ...

  2. Vue项目打包为桌面应用

    vue项目首先使用 npm run build 打包为dist文件后,进入dist目录得到如下文件:就是打包后的html+css+js+static 新建一个deskapp文件夹,里面在新建一个App ...

  3. java后端操作树结构

    一.树结构的三种组装方式(递归.双层for循环,map) (1)递归 普通递归方法 public Result getBmsMenuList(UserSessionVO userSessionInfo ...

  4. Redis 6 学习笔记 1 —— NoSQL数据库介绍,Redis常用数据类型

    NoSQL数据库介绍(了解) 技术的分类1.解决功能性的问题:Java.Jsp.RDBMS.Tomcat.HTML.Linux.JDBC.SVN,2.进一步地,解决系统功能扩展性的问题:Struts. ...

  5. Redis 技术整理

    认识Redis Redis官网:https://redis.io/ Redis诞生于2009年全称是Remote Dictionary Server 远程词典服务器,是一个基于内存的键值型NoSQL数 ...

  6. Sealos 云操作系统一键集成 runwasi,解锁 Wasm 的无限潜力

    WebAssembly (通常缩写为 Wasm) 是一种为网络浏览器设计的低级编程语言.它旨在提供一种比传统的 JavaScript 更快.更高效的方式来执行代码,以弥补 JavaScript 在性能 ...

  7. 计算网络之IPv6配置DHCP服务及acl

    一.DHCPv6服务 DHCP即动态主机地址分配协议,在前面已经启动过IPv4的动态主机分配了, 还是来介绍两种方式 接口模式 全局模式 现在需要了解的就是DHCHv6,即基于IPv6的动态主机地址分 ...

  8. Util应用框架基础(七) - 缓存

    本节介绍Util应用框架如何操作缓存. 概述 缓存是提升性能的关键手段之一. 除了提升性能,缓存对系统健壮性和安全性也有影响. 不同类型的系统对缓存的依赖程度不同. 对于后台管理系统,由于是给管理人员 ...

  9. 前端技术探秘-Nodejs的CommonJS规范实现原理

    了解Node.js Node.js是一个基于ChromeV8引擎的JavaScript运行环境,使用了一个事件驱动.非阻塞式I/O模型,让JavaScript 运行在服务端的开发平台,它让JavaSc ...

  10. RPN FPN ROIPooling

    RPN(Region Proposal Network)介绍---> 特点从backbone 生成的Feture Map中 用一个 3x3 的Conv卷积核 遍历FeatureMap的每个点然后 ...