1、计算机程序设计 C语言 第6章指针 1 指针的概念及计算 2 指针和数组 3 指针与字符串 4 指针的应用 1指针的概念计算机内存单元编号 地址地址编号范围内存地址编号和变量地址例 语句intx 3 y 6 1指针基础 变量的访问方式 直接访问 通过变量名直接存 取变量的内容 例如 printf d x 间接访问 通过变量的地址存 取变量的内容 例如 p 6 1指针基础 指针 是把内存地址作为其值的变量 2指针变量的定义类型 指针变量名 例 intx 3 p p 运算符称作取地址运算符 6 1指针基础 6 1指针基础 指针变量的定义说明 指针变量也是变量 命名规则同变量的命名 指针变量具有类型
2、 其含义表示只能存放同类型变量的地址 指针变量在使用时 一定要初始化或者让其指向某个具体的存储单元 否则可能产生内存读取错误 例 int p 定义指向int类型的变量的指针char cp 定义指向char类型的变量的指针double dp 定义指向double类型的变量的指针 3指针的基本运算 1 取地址运算单目运算符 6 1指针基础 例 int p q n p1 a 3 p 6 1指针基础 2 间接访问运算间接运算符 得到被指针所指的变量 通常有两种使用方式 间接读取变量中的数据printf d p 等价于printf d n m p q 间接赋值 p 10 等价于n 10 注意 此处的 与
3、指针定义时的 含义不同int p 表示后面的变量名表示一个指针变量 includeintmain inta 3 ap ap 运行结果 a 3 ap 3a 10 ap 105 输入并按回车键 a 5 ap 5a 6 ap 6 6 1指针基础 intmain int p1 p2 tp a b scanf d d 6 1指针基础 输入 5 9 a 5 b 9max 9 min 5 intmain int p1 p2 temp a b scanf d d 6 1指针基础 输入 5 9 a 9 b 5max 9 min 5 6 1指针基础 3 指针的自加自减运算指针自加减运算表示指针变量的值加减该类型存
4、储单元空间的大小 指向下 上 一个同类型的存储单元 如 intx y p p 4 6 1指针基础 11 2 5 6 1指针基础 5 指针的比较与算术运算p q表示指针p和指针q是否指向同一个变量或两个指针是否同时为NULL 空指针 表示不指向任何地址单元 pq p q p q p NULL等均表示地址的比较p p 2 p q 2 p q 4指针变量的初始化和赋值指针变量在定义时 就被赋于某个同类型变量的值 称为指针初始化 指针变量由于是对某个地址单元的内容进行操作 因此 在使用前 一定要指向某个具体的地址单元 否则 会出现错误 甚至导致系统错误 6 1指针基础 6 2指针与数组 数组元素在内存
5、中是连续存放的 因此除了数组元素和普通变量一样具有地址外 每个数组还有一个起始地址 这个地址通常称为数组的地址 数组的地址就是数组中第一个元素的地址 数组名就表示数组的首地址 inta 5 1 2 3 4 5 p p a 指针p指向数组a的第一个元素 6 2指针与数组 1一维数组与指针利用指针访问一维数组 方法1 p1 或p a 0 均表示指针p指向数组的起始地址 aa 0 a 1 a 2 a 3 a 4 a 5 p p p 1 p 2 例 输出数组a中的全部元素 方法1 下标法for i 0 i N i printf d a i 方法2 通过数组名访问各元素 数组名代表数组的首地址 for
6、i 0 i N i printf d a i 6 2指针与数组 方法3 指针法 includeintmain inta 5 1 2 3 4 5 int p for p a p a 5 p printf d p return0 注意 数组名所代表的数组地址 不允许出现a 的情况 这是因为a作为数组名 一旦定义就是不可改变的值 永远只能是表示数组的首地址 6 2指针与数组 指针p依次指向数组的每个元素 6 2指针与数组 例 判断一个字符串是否为回文 分析 从键盘输入一串字符 放在字符数组中 判断是否为回文 6 2指针与数组 include defineN20intmain chara N intf
7、lag 1 i n printf 请输入字符串 gets a n strlen a for i 0 i n 2 i if a i a n i 1 flag 0 break if flag 0 printf s不是回文 a elseprintf s是回文 a return0 flag作为一个标志变量 表示比较出现不相等情况 方法1 数组下标访问 include defineN20intmain chara N p q intflag 1 printf 请输入字符串 gets a p a q a strlen a 1 while p q if p q flag 0 break p q if fla
8、g 0 printf s不是回文 a elseprintf s是回文 a return0 6 2指针与数组 方法2 指针法 2二维数组与指针二维数组比一维数组复杂 可以看做是数组元素为一维数组的一维数组 6 2指针与数组 a 0 a 1 a 2 a 0 表示第0行首地址 a 1 表示第1行首地址 a 2 表示第2行首地址 a表示数组地址 二维数组地址和元素的表示 a表示数组地址a 0 a 0 0 a均可以表示第0行首地址a 1 a 1 0 a 1 均表示第1行首地址a i a i 0 a i 均表示第i行的首地址a 2 1 a 2 1 a 2 1均表示元素a 2 1 的地址a i j a i
9、j a i j均表示元素a i j 的地址 6 2指针与数组 行地址 列地址 二维数组的地址具有行地址和列地址两类行地址表示行首地址 如 a 1 表示第1行的行首地址列地址表示第i行第j列的元素地址 如 a 1 2 a 1 2 只有列地址才能访问到具体的元素 6 2指针与数组 a 0 a 1 a 2 a 例 求矩阵a对角线上元素的和 方法1 利用数组下标访问对角线上的元素 intmain inta 3 3 1 3 5 7 9 11 13 15 17 inti sum 0 for i 0 i 3 i sum sum a i i printf sum d sum return0 方法2 利用地址访
10、问对角线上的元素 a i i 6 2指针与数组 6 2指针与数组 intmain ints 4 4 i j for i 0 i 4 i for j 0 j 4 j s i j i j for j 0 j 4 j for i 0 i 4 i printf 4d s i j printf n return0 输出结果 0123 1012 2 101 3 2 10 6 2指针与数组 include hsmintmain chars ABCD char p for p s p s 4 p printf c s n p p return0 输出结果 AABCDBBCDCCDDD 6 2指针与数组 3指针
11、数组数组元素均为指针的数组称为指针数组 一维指针数组定义 类型名 数组名 数组长度 如 int p 6 数组元素为指向int类型的指针char s 5 数组元素为指向int类型的指针 intmain inta 4 4 0 int p 4 i j for i 0 i 4 i p i a i for i 0 i 4 i p i i 1 p i 4 i 1 1 for i 0 i 4 i for j 0 j 4 j printf 2d p i j printf n return0 6 2指针与数组 1001011001101001 相当与a i j 指针数组p中存放a的行地址 6 2指针与数组 定义
12、字符指针数组时用字符串常量提供初始值 例 char days Sunday Monday Tuesday Wednesday Thursday Friday Saturday days 0 days 1 days 6 6 2指针与数组 printf Workdays for i 1 i 6 i printf s n days i printf nWeekend printf s s n days 6 days 0 输出什么 6 3指针与字符串 1指针与字符串常量 includeintmain char p CLanguage for p 0 p printf c p printf n 定义一个
13、指针指向一个字符串常量 printf s p 例6 12 用指针实现两个字符串连接 6 3指针与字符串 intmain chars1 20 CLanguage s2 funy char p1 p2 for p1 s1 p1 0 p1 for p2 s2 p2 0 p1 p2 p1 p2 p1 0 printf s n s1 include includeintmain char ps 5 word excel access powerpoint frontpage char pt inti j for i 0 i0 pt ps i ps i ps j ps j pt for i 0 i 5 i
14、 printf s n ps i return0 例6 13 用指针数组实现字符串排序 选择排序法 交换ps i 和ps j 的条件是它们各自所指字符串的大小 accessexeclfrontpagepowerpointword 6 3指针与字符串 6 4指针与动态内存分配 动态内存分配 在程序运行过程中 根据需要随时向系统申请内存空间或收回内存单元 hsm1申请内存空间函数voidmalloc unsignedintsize 申请一个长度为size字节的连续空间 函数的返回值是一个指向该区域地址的指针 其类型为void 使用时用强制类型转换的方法转换成所需要的类型 例 int p p int
15、 malloc sizeof int p 动态分配的空间 2释放内存空间函数voidfree void p 释放指针p所指向的内存空间 这部分空间应是使用malloc函数所获得的 例 int p p int malloc sizeof int free p 6 4指针与动态内存分配 指向一维数组的指针变量 1数据类型 指针变量名 数组长度 例 int p 4 p指向一个长度为4的int数组char s 3 s指向一个长度为3的char数组 p include 2intmain inta 3 3 1 3 5 7 8 9 13 15 17 int p 3 i sum 0 p a for i 0 i 3 i p sum sum p i printf d sum return0 p 指向下一个3个元素的数组 p 3 p i 指向一维数组的指针变量就是一个指针 它和一般指针的区别在于 和 表示指向下一个或上一个同样类型 长度数组 指向指针的指针变量数据类型 指针变量名例 int p 指向int的指针变量的指针char s 指向char的指针变量的指针 小结 1 指针的概念及使用方法2 指针与数组的关系