C++篇:第六章_指针_知识点大全
C++篇为本人学C++时所做笔记(特别是疑难杂点),全是硬货,虽然看着枯燥但会让你收益颇丰,可用作学习C++的一大利器
六、指针
(一)指针规则
两个指针不能进行加法运算,因为指针是变量,其值是另一个变量的地址,故两地址相加没意义,但可以用一个空指针赋值给某个指针变量,值为NULL
如果两个指针是指向同一类型的两个指针,则两个指针之间可以进行相减(实际是所指向对象的相减)和关系、运算
无论任何指针在32位系统中是4字节 64位系统中是8字节
初始化为NULL的类指针,可以安全的调用不涉及类成员变量的类成员函数而不会出错
初始化指针时所创建的字符串常量被定义为只读。如果试图通过指针修改这个字符串的值,程序就会出现未定义的行为,例:char* s="AAA";
指针本身存于栈中
当free释放内存之后,指针还指向原来的那块地址,需要我们设置 p = NULL;如果不手动设置 p = NULL,此时P就变成了野指针;野指针产生原因:
声明的指针未被初始化,指针默认值随机产生。创建指针应该将其初始化为NULL或者指向某一内存。
free和delete掉的指针未重置为NULL,free后的指针仍指向该内存,但该内存已变为垃圾内存。
空指针(值为0)不指向任何实际的对象或函数,反过来说对象或函数的指针也不可能为空指针
C++的指针有数据指针,函数指针,数据成员指针,成员函数指针四种,后两种是C++专门为类扩展的称为成员指针
不要试图通过改变形参指针变量的值而使实参指针变量的值改变,因为实参变量和形参变量之间的数据传递是单向的
当实参是地址(如&a),传递的是地址,则仍然是传值方式,当实参是变量名,而传值的是变量的地址,才是传址方式
- 在使用一个指针之前,必须先赋初始值
(二)指针使用
如果p=&a,p+4指的是p的值+4,也就是a+4(ASCALL码+4),因此为e;(p+4)指的是首地址后移4位再取值
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前面的“ * ”结合,“ * ”表示此数组是指针类型的,故为指针数组
指针和void*可以相互转化(结合笔记P28void型指针)
文件指针指向的是一块内存区域,这块区域存储着打开的文件的相关信息,包括文件读取指针当前位置、文件读取缓冲区大小等信息,并不是指向文件的。fscanf是从文件中格式化读取,fprintf才是向文件中格式化写入
指针允许0值常量表达式,例:int *P;P=0;
(三)const与指针
口诀:左定值,右定向。 const在的左边不能改变字符串常量的值;const在的右边不能改变指针的指向
把一个const对象的地址赋给一个非const对象的指针变量是错误的,但反之可以
int const p // 类型为int const,此时为常指针其指向不能改变
const intp // 类型为const int,此时为指向常量的指针变量,不能通过P修改其指向的对象的值
(四)数组与指针
- int a[ ] = { 2,4,6,8 },*p=a;(注意与上面的二维数组进行区分)

- 数组名为常量指针,只能在定义是初始化,不可把其当作普通指针单独赋值或出现在左值和某些算术运算中,只有作为参数传递时才退化为普通指针
- 两个指针指向同一个数组的元素则可以进行比较,不指向同一数组则比较是无意义的
- *(a+1)[5] 这种表示不正确,因为就像int a[5];声明一个长度为5的int类型数组。这里,a[5]只是一种声明的写法,这里声明的变量是a,不是a[5]
(五)函数与指针
- Int (*P)(int a); // 定义函数指针变量;可以将函数的地址(函数名)赋值给函数指针变量。但要求函数指针变量与指向函数必须有相同的返回类型、参数个数、参数类型
(六)结构体与指针
想访问用new 所开辟的结构体空间,无法直接通过变量名进行,只能通过指针进行访问
如果要建立一个动态链表,必须从第1个结点开始,逐个的开辟结点并输入各结点数据,通过指针建立起前后相连的关系
C++篇:第六章_指针_知识点大全的更多相关文章
- C++第四篇--重载_指针_引用
C++第四篇--重载_指针_引用 1. 基础知识 重载:函数名相同,根据参数不同(类型.数量.顺序不同)调用同名函数 指针和引用:引用就是别名,引用时必须初始化,引用你定义的变量. int a; in ...
- Java语言程序设计(基础篇) 第六章 方法
第六章 方法 6.2 定义方法 1.方法的定义由方法名称.参数.返回值类型以及方法体组成. 2.定义在方法头中的变量称为形式参数(formal parameter)或者简称为形参(parameter) ...
- Java编程基础篇第六章
构造方法 一:概念: 给对象的数据(属性)进行初始化 二:特点: a.方法名与类同名(字母大小写也要一样) b.没有返回值类型 c.没有具体的返回值 return 三:构造方法重载: 方法名相同,与返 ...
- 鸟哥的Linux私房菜:基础学习篇 —— 第六章笔记
1.下面这些就是比较特殊的目录,得要用力的记下来才行: . 代表此层目录 .. 代表上一层目录 - 代表前一个工作目录 ~ 代表“目前使用者身份”所在的主文件夹 ~account 代表 account ...
- 刘汝佳 算法竞赛-入门经典 第二部分 算法篇 第六章 1(Lists)
127 - "Accordian" Patience 题目大意:一个人一张张发牌,如果这张牌与这张牌前面的一张或者前面的第三张(后面称之为一位置和三位置)的点数或花式相同,则将这张 ...
- 刘汝佳 算法竞赛-入门经典 第二部分 算法篇 第六章 2(Binary Trees)
112 - Tree Summing 题目大意:给出一个数,再给一颗树,每个头节点的子树被包含在头节点之后的括号里,寻找是否有从头节点到叶子的和与给出的数相等,如果有则输出yes,没有输出no! 解题 ...
- 明解C语言 入门篇 第六章答案
练习6-1 /* 求两个整数中的最小值 */ #include <stdio.h> /*--- 返回三个整数中的最小值 ---*/ int min2(int a, int b) { int ...
- ArcGIS for Desktop入门教程_第六章_用ArcMap制作地图 - ArcGIS知乎-新一代ArcGIS问答社区
原文:ArcGIS for Desktop入门教程_第六章_用ArcMap制作地图 - ArcGIS知乎-新一代ArcGIS问答社区 1 用ArcMap制作地图 作为ArcGIS for Deskto ...
- 《mysql必知必会》学习_第六章_20180730_欢
第六章<过滤数据> P35 1. select prod_name,prod_price from products where prod_price=2.5; 2.select prod ...
- 从IL角度彻底理解回调_委托_指针
从IL角度彻底理解回调_委托_指针 目录 从IL角度彻底理解回调_委托_指针 1.创作此文的背景 1.1.委托能帮助代码更好地封装 1.2.委托能随时随地更方便地运行其他类中的方法 1.3.委托非常适 ...
随机推荐
- Makefile 入门教程
Makefile 是一个非常强大的构建自动化工具,用于管理项目的编译.链接和其他构建任务.以下是一个详细的 Makefile 使用文档,包括基本概念.语法.示例和常见任务. 1. 基本概念 目标 (T ...
- 如何编写难以维护的 React 代码?耦合通用组件与业务逻辑
在众多项目中,React代码的维护经常变得棘手.其中一个常见问题是:将业务逻辑直接嵌入通用组件中,导致通用组件与业务逻辑紧密耦合,使其失去"通用性".这种做法使通用组件过于依赖具体 ...
- .NET 8 RC 2 发布,将在11月14日发布正式版
微软2023-10-10 发布了 .NET 8 RC 2,下一站是.NET 8正式发布,就在下个月Net Conf 2023[1](11月14日)期间正式发布,我们也开始筹备第四届中国.NET开发者峰 ...
- 可视化-vscode安装matplotlib工具
可视化工具中,最流行的工具之一是 Matplotlib,它是一个数学绘图库,可以制作简单的图表,如折线图和散点图: 使用pip可以安装Matplotlib: 安装步骤:: 1.在vscode的终端输入 ...
- 模拟退火算法(SA)
求某个目标函数的最值 爬山法 首先我们通过爬山法来引出模拟退火算法 我们先看一个例子:求函数的最值 我们用爬山法解决这个问题的步骤 1.在解空间中随机生成一个初始解(图中小黄点就是我们生成的初始解) ...
- Senparc 基础库全面适配 .NET 8.0
概要 Senparc 全家桶中的基础库已经全面适配 .NET 8.0,目前随着 .NET 8.0 的 RC 版本不断发布,对应的版本号也将同步进行更新,直到本月 Ignite 大会微软官方发布 .NE ...
- 手撕Vue-Router-添加全局$router属性
前言 经过上一篇文章的介绍,完成了初始化路由相关信息的内容,接下来我们需要将路由信息挂载到Vue实例上,这样我们就可以在Vue实例中使用路由信息了. 简而言之就是给每一个Vue实例添加一个$route ...
- cookie和session的区别?一文讲透
一.问题 cookie和session的区别? 二.回答 1.总结如下- cookie: - cookie存储于客户端本地,即浏览器缓存 - cookie存储着sessionId,作为后台sessio ...
- jdk所有版本-自留收藏
链接:https://pan.baidu.com/s/1NDbEAEbKeh8xFzjEwB8aLg 提取码:0000
- [ABC328D] Take ABC 题解
题目翻译 题目描述 给你一个字符串 \(S\) 包含 A.B 和 C 三个不用的字符. 只要字符串 \(S\) 中包含连续的 ABC 就将 ABC 删除掉 再字符串 \(S\) 不能操作之后输出这个字 ...