• 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. 炫酷转换:Java实现Excel转换为图片的方法

    摘要:本文由葡萄城技术团队原创并首发.转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 前言 在实际开发过程中,经常会有这样的需求:将Excel表格或特定区域 ...

  2. 安装vscode

    1.下载vscode安装包 因为vscode官网下载太慢, 所以从360的软件库下载: https://baoku.360.cn/soft/search?kw=vscode 2.直接点击安装 3.设置 ...

  3. 【Unity3D】UI Toolkit容器

    1 前言 ​ UI Toolkit简介 中介绍了 UI Builder.样式属性.UQuery.Debugger,UI Toolkit元素 中介绍了 Label.Button.TextField.To ...

  4. 挑战程序设计竞赛 2.2 poj 3040 Allowance 贪心

    https://vjudge.csgrandeur.cn/problem/POJ-3040 /* 作为创纪录的牛奶产量的奖励,约翰决定每周给贝西一小笔零用钱.FJ拥有一组N(1 <= N < ...

  5. 虹科喜报 | 虹科技术工程师【国内首批】拿下Redis认证开发者证书!

    要说虹科数据库技术工程师有多强悍,认证考试2022年12月上线,次年2月就以全国首批速度强势通过考试,并于两周后正式收到[Redis认证开发人员]证书! 虹科小云忍不住浅浅炫耀一下: 或许大家对Red ...

  6. 洛谷P1144

    最短路计数 题目描述 给出一个 \(N\) 个顶点 \(M\) 条边的无向无权图,顶点编号为 \(1\sim N\).问从顶点 \(1\) 开始,到其他每个点的最短路有几条. 输入格式 第一行包含 \ ...

  7. AsyncOperation更好的实现大场景载入

    说明:为了实现场景A->大场景B,可以让场景A->等待场景C->大场景B 知识点:AsyncOperation;AsyncOperation.allowSceneActivation ...

  8. BFF层提升业务性能实际解决方案,以及nodeJs和KOA框架介绍

    本文干货满满,介绍了用BFF层(Back-end For Front-end)中间层提升性能的整体解决方案和思路,涉及前期技术调研,聚合业务分析,聚合方法,验收,最后向同学们普及node.koa基础知 ...

  9. 学习Hadoop不错的系列文章(转)

    http://www.cnblogs.com/xia520pi/archive/2012/04/22/2464934.html 1)Hadoop学习总结 (1)HDFS简介 地址:http://for ...

  10. [Python急救站课程]蟒蛇的绘制

    Python的英文是有蟒蛇的意思,用Python画一条蟒蛇试试吧 一.普通蟒蛇的绘制 import turtle # 调用turtle(海龟绘图)加as t表示将库名改命名为t,后续用t.(函数名表式 ...