指针程序设计(一) 内容 说明 主要|1.指针与指针变量的概念 重点变量指 内容|2.指针变量的定义、引用及运算 针和一维数 3.一维数组与指针 组指针 重点1.指针的概念 2.变量指针和一维数组指针 3.指向变量、一维数组的指针变量 难点1.变量指针和一维数组指针的引用 主要针对一 2.指向变量、一维数组的指针变量的引用 维数组 问题定义变量系统会为变量开辟一定单元的存储空间,如何利用存储 提出空间解决变量的运算问题呢? 间接访问与直接访问 举例:打开A抽屉方法 直接访问:将A钥匙带在身上,需要时直接打开 间接访问:将A钥匙放在B抽屉,需要时,打开B抽屉取出A 钥匙,打开A抽屉。 二、指针 什么是指针 定义:指针就是地址 2.内存单元和地址 内存单元地址:计算机内部存储器由很多内存单元组成,每个内 存单元都有自己独有的地址,称内存单元地址 3.变量与地址 当一个变量只占用一个内存单元时,内存单元的地址就是变 量的地址:当变量占用连续的若干个内存单元时,最前面一个单|重点讲解 元的地址就是该变量的地址 例:inti=3: float f; 地址内存单 整型变量 通过此图讲 2002 解变量与地 址的关系 单精度变量f 变量i的地址:2001,变量f的地址:2008 由于地址起到寻找操作对象的作用,像一个指向对象的指针,所 以常把地址称为“指针”。 4.数组与地址 数组元素占用连续的内存单元。数组类型不同,每个数组元 素占用的内存单元数也不同。数组占用的总单元数等于数组长度 ×每个数组元素占用的内存单元数。 数组元素a0的地址称为数组的首地址
指针程序设计(一) 内容 说明 主要 内容 1.指针与指针变量的概念 2.指针变量的定义、引用及运算 3.一维数组与指针 重 点 变 量 指 针 和 一 维 数 组指针 主 要 针 对 一 维数组 重点讲解 通 过 此 图 讲 解 变 量 与 地 址的关系 重点 1. 指针的概念 2. 变量指针和一维数组指针 3.指向变量、一维数组的指针变量 难点 1.变量指针和一维数组指针的引用 2.指向变量、一维数组的指针变量的引用 问题 提出 定义变量系统会为变量开辟一定单元的存储空间,如何利用存储 空间解决变量的运算问题呢? 一、间接访问与直接访问 举例:打开 A 抽屉方法 直接访问:将 A 钥匙带在身上,需要时直接打开 间接访问:将 A 钥匙放在 B 抽屉,需要时,打开 B 抽屉取出 A 钥匙,打开 A 抽屉。 二、指针 1.什么是指针 定义:指针就是地址。 2.内存单元和地址 内存单元地址:计算机内部存储器由很多内存单元组成,每个内 存单元都有自己独有的地址,称内存单元地址。 3.变量与地址 当一个变量只占用一个内存单元时,内存单元的地址就是变 量的地址;当变量占用连续的若干个内存单元时,最前面一个单 元的地址就是该变量的地址。 例:int i=3;float f; 变量 i 的地址:2001,变量 f 的地址:2008 由于地址起到寻找操作对象的作用,像一个指向对象的指针,所 以常把地址称为“指针”。 4.数组与地址 数组元素占用连续的内存单元。数组类型不同,每个数组元 素占用的内存单元数也不同。数组占用的总单元数等于数组长度 ×每个数组元素占用的内存单元数。 数组元素 a[0]的地址称为数组的首地址。 地址 内存单元 元元 3 2001 2002 2008 2009 2010 整型变量 i 单精度变量f
数组元素a[的地址一数组首地址+数组元素的数据类型所占用 的内存单元数 例:inta[3]={1,2,3} 地址内存单元 整型数组元素a[0] 2 整型数组元素a[1 3003 3004 整型数组元素a[2] 三、指针变量 什么是指针变量 定义:存放地址的变量称为“指针变量” 2.指针变量的定义和初始化 指针变量在使用前必须定义,定义的同时可以赋初值。 【格式】存储类型数据类型*指针变量名1[=初值 通过例子说 【功能】定义指向指定“数据类型”或数组的若干个指针变量,明指针变量 同时给这些变量赋初值 的定义和初 例:inta;int*p=&a; float fI,红10,*pl=&组,*p2=f; 始化应注意 3.指针变量的引用方式 的问题 (1)给指针变量赋值 【格式】指针变量=地址表达式 例 p;p=& (2)直接引用指针变量名 例:inti,j,*=&i,*q;q=p; scanf(“%d,%d”,q,&j) (3)通过指针变量来引用它所指向的变量 【格式】*指针变量名 例如 四、取地址运算符与指针运算符 取地址运算符(&):取运算对象的地址。如&a 指针运算符(*):取指针变量所指向的变量或数组元素的值 例如:int↑,a;p=&a;则*p==a为真 【例】利用指针,求两个整数的和。 /*定义指针变量* 建立关联 p, q /使用指针变量*/ p,*q); printf(("和=%d
数组元素 a[i]的地址=数组首地址+i×数组元素的数据类型所占用 的内存单元数 例:int a[3]={1,2,3}; 三、指针变量 1.什么是指针变量 定义:存放地址的变量称为“指针变量”。 2.指针变量的定义和初始化 指针变量在使用前必须定义,定义的同时可以赋初值。 【格式】存储类型 数据类型 *指针变量名 1[=初值 1],…; 【功能】定义指向指定“数据类型”或数组的若干个指针变量, 同时给这些变量赋初值。 例:int a;int *p=&a;float f1,f[10],*p1=&f1,*p2=f; 3.指针变量的引用方式 (1)给指针变量赋值 【格式】指针变量=地址表达式 例: int i,*p;p=&i; (2)直接引用指针变量名 例:int i,j,*p=&i,*q;q=p;scanf(“%d,%d”,q,&j); (3)通过指针变量来引用它所指向的变量 【格式】*指针变量名 例如:int i=1,j=2,k,*p=&i;k=*p+j; 四、取地址运算符与指针运算符 取地址运算符(&):取运算对象的地址。如&a 指针运算符(*):取指针变量所指向的变量或数组元素的值。 例如:int *p,a;p=&a;则*p= =a 为真。 【例】利用指针,求两个整数的和。 main( ) { int i, j ,sum ; int *p, *q; /*定义指针变量*/ p=&i; q=&j; /*建立关联*/ scanf(″%d, %d″, p, q); sum=*p+*q; /*使用指针变量*/ printf (″%d, %d\n″, *p, *q); printf(″和= %d \n″, sum); } 通 过 例 子 说 明 指 针 变 量 的 定 义 和 初 始 化 应 注 意 的问题 地址 内存单元 1 3000 3001 3002 3003 3004 3005 3006 整型数组元素 a[0] 2 3 整型数组元素 a[1] 整型数组元素 a[2]
五、用指针变量引用一维数组元素 如何将指针变量指向数组的首地址? (1)初始化:数据类型*指针变量=数组名 (2)程序中赋值:指针变量=数组名 (3)若指针变量指向某数组元素:*指针变量=&数组名[下标 1.用指向数组元素的指针变量处理数组元素 (1)当指针变量指向数组的首地址,引用数组元素的方法 引用“数组元素0”*(指针变量+0)或*指针变量 引用“数组元素订”:*(指针变量+i) (2)当指针变量指向下标为i的数组元素,引用数组元素的方法 引用“数组元素[”*(指针变量+0)或*指针变量 用“数组元素[k]”*(指针变量-k) 引用“数组元素[+k]”:*(指针变量+k) (3)当指针变量指向数组首地址,对下标i的数组元素引用方法 ①*(指针变量+i)②*(数组名+i)③指针变量[i④数组名[i 2.指向数组元素的指针变量的运算 (1)指针变量算术运算 指针变量+整数指针变量一整数++指针变量指针变量 指针变量++ 指针变量 指针变量1一指针变量2两个指针变 (2)指针变量的关系运算 量必须指向 指针变量1关系运算符指针变量2 同一数组 【例】指针法实现数组的输入、输出 main t int a[10]: Int 1,"p: /定义指针变量* /*建立关联*/ for(F=0;10:计+ scanf (%d", p++) printf ("In") for (p=a: p<a+10: p++) 使用* printf("%3d",*p) 六、小结 本节主要讲述了指针与指针变量的概念、指针变量的定义 引用及运算以及指向一维数组的指针变量的定义和应用。重点是 对变量指针和一维数组指针概念的理解。 七、作业 教师自留
五、用指针变量引用一维数组元素 如何将指针变量指向数组的首地址? (1)初始化:数据类型 *指针变量=数组名 (2)程序中赋值:指针变量=数组名 (3)若指针变量指向某数组元素:*指针变量=&数组名[下标] 1.用指向数组元素的指针变量处理数组元素 (1)当指针变量指向数组的首地址,引用数组元素的方法 引用“数组元素[0]”: *(指针变量+0)或*指针变量 引用“数组元素[i]”: *(指针变量+i) (2)当指针变量指向下标为 i 的数组元素,引用数组元素的方法 引用“数组元素[i]”: *(指针变量+0)或*指针变量 引用“数组元素[i-k]”: *(指针变量-k) 引用“数组元素[i+k]”: *(指针变量+k) (3)当指针变量指向数组首地址,对下标 i 的数组元素引用方法 ① *(指针变量+i)②*(数组名+i)③ 指针变量[i]④数组名[i] 2.指向数组元素的指针变量的运算 (1)指针变量算术运算 指针变量+整数 指针变量-整数 ++指针变量 --指针变量 指针变量++ 指针变量-- 指针变量 1-指针变量 2 (2)指针变量的关系运算 指针变量 1 关系运算符 指针变量 2 【例】指针法实现数组的输入、 输出 main( ) { int a[10]; int i, *p; /*定义指针变量*/ p=a; /*建立关联*/ for(i=0; i<10; i++) scanf (″%d″, p++); printf(″\n″); for (p=a; p<a+10; p++) /*使用*/ printf(″%3d″, *p); } 实例讲解 举例 两 个 指 针 变 量 必 须 指 向 同一数组 六、小结 本节主要讲述了指针与指针变量的概念、指针变量的定义、 引用及运算以及指向一维数组的指针变量的定义和应用。重点是 对变量指针和一维数组指针概念的理解。 七、作业 教师自留
指针程序设计(二) 主要1.二维数组与指针 主要讲 内容2.字符串与指针 字符指针 3.字符指针与字符数组的区别 重点1.指向字符串的指针变量的引用 2.字符指针与字符数组的区别 难点1.指向字符串的指针变量 2.字符指针与字符数组的不同用法 问题前面学习了指针的概念、指针在一维数组中的应用方法,那么如何 引入|使用指针变量解决字符串的操作问题? 使用指针表示二维数组 先复习 二维数组元素的地址 指针在 inta[3[4={{1,3,5,7},{9,11,13,15},{17,19,2123}}; 一维数组 二维数组a[34可看成由3个一维数组a0、al、a2]组成,中的应用 每个一维数组由4个元素组成。如下图所示。 +1a+2a0y+3 a+1 a+2 a代表二维数组首元素的地址,a]、a[、a[2]是一维数组名 而C语言规定数组名代表数组首元素的地址,即a0等于&a[o[0] []等于&a1[0]、a[2等于&a[2J0]。 2、使用指针表示二位数组元素 进一步分析:a0等于&a0],a[O+1等于&a[oJ1],a[O+2 等于&a[0][2],a[0+3等于&a[OJ[3 因为a0]和*(a+0)等价,a]和*(a+1)等价,a和*(ati) 等价,因此: a[0+1等价*a+0)+1等价&a[OJ[1 a[1]+2等价*a+1)+2等价&a[l12 注意:不要将*a+1)+2错写成*(a+1+2)相当a[3] 进一步分析:因为&a[O[等价a[0]+1等价*(a+0)+1,那么 (*(a+0)+1)或*(*a+1)等价a[o]的值。*(a]+或气*a+i)+j)等价 a[i[]的值 用指针变量引用二维数组元素 用指向数组元素的指针变量引用二维数组元素,此种方法 是将二维数组当作一维数组来处理 例1:用指针变量输出数组元素的值
指针程序设计(二) 内容 说明 主要 内容 1.二维数组与指针 2.字符串与指针 3.字符指针与字符数组的区别 主要讲 字符指针 先复习 指针在 一维数组 中的应用 重点 1. 指向字符串的指针变量的引用 2. 字符指针与字符数组的区别 难点 1. 指向字符串的指针变量 2. 字符指针与字符数组的不同用法 问题 引入 前面学习了指针的概念、指针在一维数组中的应用方法,那么如何 使用指针变量解决字符串的操作问题? 使用指针表示二维数组 二维数组元素的地址 int a[3][4]={{1,3,5,7},{9,11,13,15},{17,19,21,23}}; 二维数组 a[3][4]可看成由 3 个一维数组 a[0]、a[1]、a[2]组成, 每个一维数组由 4 个元素组成。如下图所示。 a 代表二维数组首元素的地址,a[0]、a[1]、a[2]是一维数组名, 而 C 语言规定数组名代表数组首元素的地址,即 a[0]等于&a[0][0]、 a[1]等于&a[1][0]、a[2]等于&a[2][0]。 2、使用指针表示二位数组元素 进一步分析:a[0]等于&a[0][0],a[0]+1 等于&a[0][1],a[0]+2 等于&a[0][2],a[0]+3 等于&a[0][3]。 因为 a[0]和*(a+0)等价,a[1]和*(a+1)等价,a[i]和*(a+i) 等价,因此: a[0]+1 等价 *(a+0)+1 等价 &a[0][1] a[1]+2 等价 *(a+1)+2 等价 &a[1][2] 注意:不要将*(a+1)+2 错写成*(a+1+2)相当 a[3]。 进一步分析:因为&a[0][1]等价 a[0]+1 等价 *(a+0)+1,那么 *(*(a+0)+1)或*(*a+1)等价 a[0][1]的值。*(a[i]+j)或*(*a+i)+j)等价 a[i][j]的值 二、用指针变量引用二维数组元素 1.用指向数组元素的指针变量引用二维数组元素,此种方法 是将二维数组当作一维数组来处理。 例 1:用指针变量输出数组元素的值。 23 1 3 5 7 9 11 13 15 17 19 21 a[0] a[1] a[2] a a+1 a+2 a[0] a[0]+1a[0]+2 a[0]+3 23
maino {inta3][4}={1,3,57,9,113.15,17,1921,23} for(p=a[0];p<a[0]+12p+) fif((p-al[01%4==0) printf("n); printi(64d”,*p) 2.用指向由m个元素组成的一维数组的指针变量引用二维数 组元素 为了和二维数组名相对应,可以定义一个行指针变量来引用二 维数组元素。 定义行指针的一般形式为 类型(*指针变量名)[M 如int(*p)[4 注意两种 表示定义了一个指向包含4个整型元素的一维数组的指针变输出方式 的不同 例2:输出二维数组任一行任一列元素的值。 {inta3]4]={1,3,,7,9,113.15,17,19,21,23 (*p)[4], scanf("I=%d, j=%od,, &i, &") printf("a[%d, %d=%d\n, ij, *((p+i)+j) 三、指向字符串的指针变量的使用 1.将指针变量指向字符串常量的方法 例:将字符指针变量p指向“abcd” 方法一:初始化形式 数据类型*指针变量=字符串常量 char*p=“abcd” 方法二:赋值语句 指针变量=字符串常量 harp;p=“abcd 举例说明 2.指向字符串常量的指针变量的使用 (1)处理整个字符串 输出字符串 printf(“%“,指针变量); 输入新的字符串代替原字符串 scanf(“%s”,指针变量) (2)处理字符串中的单个字符 第i个字符的表示方法:*(指针变量+i) 3.指向存放字符串的字符数组的指针变量的使用 处理字符串中的单个字符就是处理一维数组的元素,方法 同处理一维数组元素。 注意:字符数组元素的类型是字符型
main() {int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23}; int *p; for(p=a[0];p<a[0]+12;p++) {if((p-a[0])%4==0) printf(“\n”); printf(“%4d”,*p); } } 2.用指向由 m 个元素组成的一维数组的指针变量引用二维数 组元素 为了和二维数组名相对应,可以定义一个行指针变量来引用二 维数组元素。 定义行指针的一般形式为: 类型 (*指针变量名)[M] 如 int (*p)[4] 表示定义了一个指向包含 4 个整型元素的一维数组的指针变 量。 例 2:输出二维数组任一行任一列元素的值。 main() {int a[3][4] ={1,3,5,7,9,11,13,15,17,19,21,23}; int (*p)[4],i,j; p=a; scanf(“i=%d,j=%d”,&i,&j”); printf(“a[%d,%d]=%d\n”,i,j,*(*(p+i)+j)); } 三、指向字符串的指针变量的使用 1.将指针变量指向字符串常量的方法 例:将字符指针变量 p 指向“abcd” 方法一:初始化形式 数据类型 *指针变量=字符串常量 char *p=“abcd”; 方法二:赋值语句 指针变量=字符串常量 char *p;p=“abcd”; 2.指向字符串常量的指针变量的使用 (1)处理整个字符串 输出字符串 printf(“%s“,指针变量); 输入新的字符串代替原字符串 scanf(“%s”,指针变量); (2)处理字符串中的单个字符 第 i 个字符的表示方法: *(指针变量+i) 3.指向存放字符串的字符数组的指针变量的使用 处理字符串中的单个字符就是处理一维数组的元素,方法 同处理一维数组元素。 注意:字符数组元素的类型是字符型。 注意两种 输出方式 的不同 举例说明