首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

C++程序设计基础学习笔记:(6)指针:所向披靡的“金箍棒” 魂

  • 25-03-03 17:24
  • 2693
  • 13463
blog.csdn.net

相关博客目录

C++程序设计基础学习笔记:(1)初识C++语言:从认识变量和常量开始,数据的表示
C++程序设计基础学习笔记:(2)计算:从数据运算开始,数据简单运算
C++程序设计基础学习笔记:(3)分支结构:无处不在的抉择
C++程序设计基础学习笔记:(4)循环结构:周而复始,求同存异
C++程序设计基础学习笔记:(5)数组:实现算法的利器
C++程序设计基础学习笔记:(6)指针:所向披靡的“金箍棒” 魂
C++程序设计基础学习笔记:(7)函数:面向过程的基础
C++程序设计基础学习笔记:(8)文件:让数据流动起来
C++程序设计基础学习笔记:(9)以人为本:用类与对象诠释现实世界
C++程序设计基础学习笔记:(10)从生物遗传说起,取其精华——继承与多态

第6章 指针:所向披靡的“金箍棒” 魂

6.1 指针概述及基本应用

内存地址

计算机的内存被划分为一个个的存储单元,简称内存单元。

内存单元按一定的规则编号,这个编号就是存储单元的地址。

image-20210402095727924

变量与内存地址

程序中定义的变量要占用一定的内存空间,不同的数据类型的变量占用的内存空间大小不一样。

访问内存中的数据

从内存单元中访问数据的方法有两种:直接访问和间接访问。

直接访问

通过变量名,直接对变量的存储单元进行存取访问。

定义变量后,该变量名也就成为了相应内存空间的名称,表现在程序语句中就是通过变量名来存取变量内容。

间接访问

根据变量的地址进行存取访问。

指针变量与指针变量的定义

指针变量是一种特殊的变量,用于存放内存单元的地址,即能存放地址的变量就是指针变量。

指针变量定义的一般格式如下:

数据类型 *指针变量名;
  • 1

定义语句中的“*”表示该变量为指针变量。

指针变量前的数据类型规定了指针变量指向的变量的数据类型。

例如:double *p;
定义变量p为指针变量,且指针变量p的值只能是一个double类型变量的地址。

指针变量的三个要素

变量名:与一般变量取名相同,由英文字符开始。

指针变量的类型:指针所指向的变量的类型,而不是自身的类型。指针变量本身均为long int类型;

指针变量的值:是某个变量的内存地址。

地址运算符:&

取地址运算符&,是一个一元运算符,用来得到一个变量的地址。

image-20210402100337212

例如int a;
&a表示变量a在内存中的起始地址。&后面必须是一个变量。

指针运算符 ‘’*’’

指针运算符* 是一个一元运算符,表示指针变量所指向的变量的值(取值),需要跟一个指针类型的变量。(这就是间接访问的形式)
注意*在不同地方出现的含义是不同的。

image-20210402100502924

指针变量的初始化与赋值

在定义初始化时赋值:

数据类型 *指针名=地址
  • 1

指针赋值:

指针变量=地址;
  • 1

其中的“地址”可以是变量的地址、数组名等。

image-20210402100926909

指针赋值注意事项

不能把常量或表达式赋给指针变量。p=&67;p=&(i+5)是非法的

不能将一个整数赋给指针变量,但可以赋整数值0,0是可以直接赋给指针变量的唯一整数值,表示空地址

image-20210402101332080

6.2 指针和一维数组

image-20210402101543733

指针与一维数组

数组名表示数组的首地址,即数组第一个元素的地址

数组名是地址常量不可以更改

数组名加上整型实数可以实现数组其他元素的取用a+1是a[i]的地址

可以使用数组首地址作为指针信息给指针变量赋值

image-20210402102632216

数组取用有两种方式:下标表示(前面已经讲过),指针表示

a[i] (直接访问) <=> *(a+i) (间接访问)

image-20210402102613456

指针的算术运算与比较运算

算数运算和比较运算的组合可以很容易完成指针对于数组的遍历循环

p++后,p指针指向的地址->下一个下标对应的地址

p–后,p指针指向的地址->上一个下标对应的地址

若有语句int*p1=&a[1], *p2=&a[4];p2-p1的意义两指针之间的数据个数

p1与p2可以比较大小

举例:求两个集合的交集

image-20210402103134277

image-20210402103919073

6.3.1指针和二维数组

image-20210405102623014

二维数组与行指针与列指针

从逻辑上看有行列的关系,但是存在于计算机中还是线性存储

举例:int a[3][4];

对于二维数组a:
a是数组名,包含三个元素a[0], a[1], a[2]
每个元素a[i],又是一个一维数组,包含4个元素;
二维数组具有二级地址的含义

a-----行地址,数组的首地址,第0行首地址
a+i-----行地址,第i行的首地址
a[i] <=>*(a+i)----列地址,第i行第0列的元素地址

所以称a+i 为行指针

a[i]+j <=>*(a+i)+j—列地址,第i行第j列的元素地址
*(a[i]+j) <=>*(*(a+i)+j) <=>a[i][j] 第i行第j列元素值

所以称*(a+i)+j 为列指针

image-20210405095931942

image-20210405100614468

指向二维数组单个元素的指针变量:列指针

image-20210405101800014

指向二维数组中一维数组的指针变量:行指针


image-20210405102537486

6.3.2 指针和二维数组应用

背景

image-20210405102650323

数学模型

image-20210405104323473


image-20210405104348021

代码

6.4 指针数组

image-20210405104446365

指针数组定义

数据类型 *数组名[数组长度说明];
例
    int *p[4];
  • 1
  • 2
  • 3

指针数组赋值与初始化

指针数组赋值

image-20210405104802795

image-20210405104916850

指针数组初始化

image-20210405105021179

image-20210405104916850

image-20210405105211961

image-20210405105419878

二维数组与指针数组区别

image-20210405105539789

用指针数组处理二维数组

image-20210405111334878

指针数组与数组指针的区别

语法形式:

指针数组int *a[10];
数组指针int(*p)[10];

实际含义:

指针数组是指一个数组里面装着指针,也即指针数组是一个数组;
数组指针是一个指向数组的指针,本质上还是一个指针,只不过指向数组而已;

对字符串排序(简单选择排序按字典顺序从小到大排序)

在内存中并没有改变

改变的是指针数组中每个指针对应的位置上

image-20210405112450861

image-20210405140506255

6.5 多级指针、动态存储分配

多级指针(二级指针)

定义: 指向指针的指针

一级指针:指针变量中存放目标变量的地址

image-20210405140757231

二级指针:指针变量中存放一级指针变量的地址

image-20210405140908513

举例:用二级指针处理字符串

image-20210405141127518

二级指针与指针数组的关系

int **p 与int *q[10]

指针数组名q是二级指针常量,q[i]是指针变量;

如果执行p=q; 则p+i是q[i]的地址;

系统只给p分配能保存一个指针值的内存区;而给q分配10块内存区,每块可保存一个指针值;

动态存储分配

分配

动态存储分配: 程序需在运行时根据需要分配相应大小的存储空间。

动态分配内存的格式如下:

指针变量名 = new 类型名(初值列表);
  • 1

由于空间没有变量名字所以只能通过指针进行间接访问

类型名决定分配空间的大小

初值列表是可选的

举例

image-20210405141951098

释放

释放指针所指向的内存空间的格式为:

delete 指针名;
  • 1

例如:delete point;

注意: 释放了point所指目标的内存空间,指针point本身并没有撤销。

建议这时将point置空(NULL)。

判断申请空间是否成功

image-20210405142432688

动态数组

动态数组解决什么问题?

定义数组时元素个数还不能确定;(在编译前还不能确定)

动态数组如何定义?

指针变量名=new 类型名[下标表达式];
delete[ ] 指向该数组的指针变量名;
  • 1
  • 2

指定数组元素的个数,可以是变量

如何访问各元素?

由上式定义的是无名数组,
其元素只能通过指针变量间接访问。

举例:

image-20210405143351077

image-20210405143400000

image-20210405143547404

注:本文转载自blog.csdn.net的呆呆象呆呆的文章"https://blog.csdn.net/qq_41554005/article/details/115442130"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top