C语言程序设计指针样本教案

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

五、指向一维数组的指针变量的使用
如何将指针变量指向数组的首地址?
(1)初始化:数据类型 *指针变量=数组名
(2)程序中赋值:指针变量=数组名
(3)若指针变量指向某数组元素:*指针变量=&数组名[下标]
1.用指向一维数组的指针变量处理数组元素
(1)当指针变量指向数组的首地址,引用数组元素的方法
引用“数组元素[0]”: *(指针变量+0)或*指针变量
变量 p,并使 p 指向二维数组 a 的首地址。
对应二维数组中 2 个一维数组的首地址表示如下:
二维数组中的一维数组 指针变量表示一维数组的首地址
a[0]
*(p+0)
a[1]
*(p+1)
二维数组元素的引用格式:
数组元素 a[0][0]
a[0][1]
a[0][2]
引用格式 *(*(p+0)+0) *(*(p+0)+1) *(*(p+0)+2)
类型做函数参数的作用是将一个地址值传送到函数中。
【例 4】编写一函数,通过函数调用显示一个字符串。
Main()
{ void disp(); char *p=”C is a programming language.”; disp(p);
} void disp(char *q); { printf(“%s\n”,q);}
3004
3
3005
整型数组元素 a[2]
3006
三、指针变量
1.什么是指针变量
定义:存放内存地址的变量称为“指针变量”。
2.指针变量的定义和初始化
指针变量在使用前必须定义,定义的同时可以赋初值。
通过例子说
【格式】存储类型 数据类型 *指针变量名 1[=初值 1],…; 明 指 针 变 量 【功能】定义指向指定“数据类型”或数组的若干个指针变量, 的 定 义 和 初
因为 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[0][1]等价 a[0]+1 等价 *(a+0)+1,那么
1.将指针变量指向字符串常量的方法
例:将字符指针变量 p 指向“abcd”
方法一:初始化形式
数据类型 *指针变量=字符串常量 char *p=“abcd”;
方法二:赋值语句
指针变量=字符串常量 char *p;p=“abcd”;
2.指向字符串常量的指针变量的使用
(1)处理整个字符串
输出字符串 printf(“%s”,指针变量);
for (j=0;j<3;j++) scanf(“%d”,p+i*3+j);
for (i=0;i<2;i++) { printf(“\n”); for (j=0;j<3;j++) printf(“%10d”,*(p+i*3+j)); }}
3.指针变量指向二维数组中某个一维数组 (1) 让指针变量指向二维数组中某个一维数组的方法 步骤:①定义指针变量 数据类型(*指针变量)[m]
初始化:① 数据类型 *指针变量=二维数组名 ② 数据类型 *指针变量=&二维数组名[0][0]
赋值: ① 指针变量=二维数组名 ② 指针变量=&二维数组名[0][0]
(2)二维数组元素的引用方法 *(指针变量+i*列数+j) 【例 2】使用指向二维数组首地址的指针变量重编上个例 1 main() {int a[2][3],*p,i,j; for (i=0;i<2;i++)
二维数组 a[3][4]可看成由 3 个一维数组 a[0]、a[1]、a[2]组成,
每个一维数组由 4 个元素组成。如下图所示。
a[0] a[0]+1 a[0]+2 a[0]+3
难点
a
a[0]
a+1 a[1] a+2 a[2]
13 9 11 17 19
57 13 2135 21 23
a 代表二维数组首元素的地址,a[0]、a[1]、a[2]是一维数组
输入新的字符串代替原字符串 scanf(“%s”,指针变量);
(2)处理字符串中的单个字符
第 i 个字符的表示方法: *(指针变量+i)
3.指向存放字符串的字符数组的指针变量的使用
处理字符串中的单个字符就是处理一维数组的元素,方法同
处理一维数组元素。注意:字符数组元素的类型是字符型。
七、小结
指向变量、一维数组、字符串的指针变量的定义和应用。
scanf(“%d”,*(p+i)+j);
for (i=0;i<2;i++)
{ printf(“\n”);
for (j=0;j<3;j++)
printf(“%10d”,*(*(p+i)+j));
}}
三、如何使用指针处理函数问题
难点 1.指针变量做函数参数 函数的参数可以是整型、浮点型、字符型、指针类型的数据。指针
八、作业
数组名的特 殊性 实例讲解
举例
注意:数组名 是否可以进 行这些运 算? 两个指针变 量必须指向 同一数组
举例
主要 内容 重点 难点 问题 提出
重点
指明
1.多维数组指针和指向多维数组的指针变量的引用
主要讲二维数
2.函数指针和指向函数的指针变量
组指针
3.指针数组和多级指针
名,而 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]。
for (j=0;j<3;j++) {p=&a[i][j];scanf(“%d”,p);}
for (i=0;i<2;i++) { printf(“\n”); for (j=0;j<3;j++) { p=&a[i][j];printf(“%10d”,*p); } } }
2.指针变量指向二维数组的首地址 (1)让指针变量指向二维数组首地址的方法
1. 指向二维数组的指针变量的引用
2. 指向函数的指针变量的引用
1. 指向二维数组的指针变量
2. 指向函数的指针变量
先复习二维数
前面学习了通过指针访问一维数组,那么如何通过指针对二维数组 组的性质
进行访问呢?二维数组中隐含着怎样的地址关系呢?
一 、指针表示二维数组
1、 二维数组元素的地址
int a[3][4]={{1,3,5,7},{9,11,13,15},{17,19,21,23}};
元素占用的内存单元数也不同。数组占用的总单元数=数组长度 ×每个数组元素占用的内存单元数。 数组元素 a[i]的地址=数组首地址+i×数组元素的数据类型所占用 的内存单元数 例:int a[3]={1,2,3};
地址 内 存 单
3000 3001

1
整型数组元素 a[0]
3002
2
3003
整型数组元素 a[1]
① *(指针变量+i)②*(数组名+i)③ 指针变量[i]④数组名[i]
2.指向一维数组的指针变量的运算
(1)指针变量算术运算
指针变量+整数 指针变量-整数 ++指针变量 --指针变量
指针变量++
指针变量--
指针变量 1-指针变量 2
(2)指针变量的关系运算
指针变量 1 关系运算符 指针变量 2
六、指向字符串的指针变量的使用
主要 内容
重点 难点 问题 提出
指针程序设计
第一讲
内容
说明
1.指针与指针变量的概念
重点:变量指
2.变量指针、一维数组指针、字符串指针 3.指向变量、数组、字符串的指针变量
针和一维数 组指针
1. 指针的概念
2. 变量指针和一维数组指针
3.指向变量、一维数组的指针变量
1.变量指针和一维数组指针的引用
2.指向变量、一维数组的指针变量的引用
数组元素 a[1][0]
a[1][1]
a[1][2]
引用格式 *(*(p+1)+0) *(*(p+1)+1) *(*(p+1)+2)
【例 3】用指向二维数组中一维数组的指针变量重新编写例 1
main()
{int a[2][3],(*p)[3]=a;int i,j;
for (i=0;i<2;i++)
for (j=0;j<3;j++)
同时给这些变量赋初值。
始化应注意
例: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);
1.什么是指针
定义:指针就是地址。
2.内存单元和地址
内存单元地址:计算机内部存储器由很多内存单元组成,每个内
存单元都有自己唯一的地址编码,称内存单元地址。
3.变量与地址
重点讲解
当一个变量只占用一个内存单元时,内存单元的地址就是变
量的地址;当变量占用连续的若干个内存单元时,最前面一个单
元的地址就是该变量的地址。
主要针对一
定义变量时,系统会为变量开辟相应数量的内存单元存储数据, 维数组
是否可以通过内存单元对应的内存地址来访问内存单元中存储的
数据呢?如果可以的话,如何来实现呢?
一、间接访问与直接访问
举例:打开 A 抽屉方法 直接访问:将 A 钥匙带在身上,需要时直接打开 间接访问:将 A 钥匙放在 B 抽屉,需要时,打开 B 抽屉取出 A 钥匙,打开 A 抽屉。 二、指针与地址
说明:m 是二维数组的列长
该指针变量 体现不出二 维数组“维” 的概念。
注意 scanf
注意 printf 该指针变量 体现了二维 数组“维” 的概念。
②用初始化或赋值方法将指针变量指向二维数组的首地址
数据类型 (*指针变量)[m]=二维数组名 (初始化)
指针变量=二维数组名
(赋值)
注意:( )不能丢,不能写成“*指针变量[m]”;[ ]运算符高于*
例:int i=3;float f;
地址
内存单
2001 2002

3
整型变量 i
通过此图讲 解变量与地 址的关系
。。。
2008 2009 2010
单精度变量 f
变量 i 的地址:2001,变量 f 的地址:2008 由于地址起到寻找操作对象的作用,像一个指向对象的指针,所 以常把地址称为“指针”。
4.数组与地址 数组元素要占用连续的内存单元。数组类型不同,每个数组
(3)通过指针变量来引用它所指向的变量 【格式】*指针变量名 注意:这种引用方式要求指针变量必须有值。
例如:int i=1,j=2,k,*p=&i;k=*p+j; 四、取地址运算符与指针运算符
取地址运算符(&):取运算对象的地址。如&a 指针运算符(*):取所指向的变量或数组元素。
例如:int *p,a;p=&a;则*p= =a 为真。
③二维数组中第 i 行对应的一维数组首地址的表示
*(指针变量+i)
(2)二维数组元素的引用方法
数组元素地址:*(指针变量+行下标)+列下标
数组元素引用:*(*(指针变量+行下标)+列下标)
其中:*(指针变量+行下标)是行下标对应的一维数组的首地址。
例:int a[2][3],(*p)[3]=a;
说明:定义二维数组 a[2][3]和指向具有 3 个元素的一维数组指针
*(*(a+0)+1) 或 *(*a+1) 等 价 a[0][1] 的 值 。 *(a[i]+j) 或
*(*a+i)+j)等价 a[i][j]的值
二、如何使用指针变量指向二维数组?
当定义了二维数组和同类型的指针变量后,可使这个指针变量:
①指向二维数组的首地址
②指向二维数组中某个一维数组 ③指向二维数组的某个数组元素 1.指针变量指向二维数组的某个元素 (1)让指针变量指向二维数组的某个元素的方法 初始化:数据类型 *指针变量=&数组名[下标 1][下标 2] 赋值:指针变量=&数组名[下标 1][下标 2] (2)二维数组元素的引用方法 *指针变量 【例 1】输入 2 行 3 列的矩阵元素,存入二维数组,再按行列格式 输出 main() {int a[2][3],*p,i,j; for (i=0;i<2;i++)
引用“数组元素[i]”: *(指针变量+i)
(2)当指针变量指向下标为 i 的数组元素,引用数组元素的方法
引用“数组元素[i]”: *(指针变量+0)或*指针变量
引用“数组元素[i-k]”: *(指针变量-k)
引用“数组元素[i+k]”: *(指针变量+k)
(3)当指针变量指向数组首地址,对下标 i 的数组元素引用方法
相关文档
最新文档