• 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. 轻巧的批量图片压缩工具imgfast

    现在的手机拍照动辄2M3M,还有7M8m的,如果要把这些文件上传到网上应用,浪费网络,占用资源 所以2022年中秋写了这个小工具,可以批量进行图片文件压缩,支持jpg和png. 文件下载链接https ...

  2. 【Unity3D】UI Toolkit样式选择器

    1 前言 ​ UI Toolkit简介 中介绍了样式属性,UI Toolkit容器 和 UI Toolkit元素 中介绍了容器和元素,本文将介绍样式选择器(Selector),主要包含样式类选择器(C ...

  3. Python 用户输入和字符串格式化指南

    Python 允许用户输入数据.这意味着我们可以向用户询问输入.在 Python 3.6 中,使用 input() 方法来获取用户输入.在 Python 2.7 中,使用 raw_input() 方法 ...

  4. 递归+记忆化递归+DP:斐波那契数列

    递归:算法复杂度O(2^N) 1 int fib(int n) 2 { 3 if (n == 0) 4 { 5 return 0; 6 } 7 if (n == 1) 8 { 9 return 1; ...

  5. CF1881C Perfect Square 题解

    思路 简单滴很,对于每一组 \((i,j)\) 找出其对应的三个点,减一减就完了. 对应的点是哪三个呢?显然是 \((n-i+1,n-j+1)\),\((j,n-i+1)\) 以及 \((i,n-j+ ...

  6. day2-JS基础&流程控制

    typora-root-url: img 自增自减运算符 1.基本使用 内置提供 ++.--运算符 是用于将变量本身进行加1或者减1操作 // 1.基本使用 var i = 10; i++;//等价于 ...

  7. mysql之慢sql配置与分析

    mysql的慢查询sql是通过日志记录慢SQL--(俗称慢查询日志)默认的情况下,MySQL数据库不开启慢查询日志(slow query log),需要手动把它打开 开启慢查询日志 SET GLOBA ...

  8. Mock基础知识

    使用的框架:moco框架下载地址:https://repo1.maven.org/maven2/com/github/dreamhead/moco-runner/1.1.0/ 启动方式:java -j ...

  9. 【I/O设备】显示设备 Display

    显示设备 电信号→视觉信号 属于软复制输出设备:输出内容不能长期保存 显示内容分为:字符.图形.图像 按显示器件分类:CRT.LCD.OLED等 (PD.LED.ELD.ECD.EPID) 按显示原理 ...

  10. 芯片SDC约束 -复制保存

    https://www.cnblogs.com/pcc-uvm/p/16996456.html?share_token=9651df97-e94c-4653-bf71-0a0fd6ca415e& ...