内容正文:
8.1与8.2节:指针的概念及指向简单变量的指针
编程语言基础——C语言
同步精品课堂
高教版(第5版)
掌握国家标准《机械制图》中有关图幅、比例、字体图线等基本规定。
教学目标
一
03
能够正确定义指针变量,掌握指针变量的初始化、赋值和引用方法
能够运用指针变量编写程序,实现通过指针访问变量、交换变量值等基本操作
04
能够区分变量的直接访问方式和间接访问方式,理解通过指针间接访问变量的原理
02
掌握内存单元地址与内容的区别,理解指针和指针变量的定义及其相互关系
01
教学重难点
二
03
通过指针访问变量:能够正确使用指针变量间接访问和修改其所指向的变量值
指针变量的间接访问方式:理解并掌握通过指针间接访问变量的原理,区分指针变量本身的值和它所指向的变量的值
04
指针变量的引用:掌握通过指针运算符*访问指针所指向变量的方法
02
指针与指针变量的概念:理解指针是地址,指针变量是存放地址的变量,二者之间的关系
01
导入新课
三
指针的"寻宝游戏"
指针 = 寻宝地图
如果我们有100个X标记点,如何快速找到并修改宝藏?
X标记点 → 内存地址
宝藏内容 → 变量值
地图本身 → 指针变量
今天,我们将学习C语言中的'寻宝神器'——指针,它能让程序高效地找到并操作内存中的数据!
新知讲授
四
指针是C语言中的一个重要概念,也是C语言的一个重要特色。正确而灵活地运用它,可以有效地表示复杂的数据结构;能动态分配内存;方便地使用字符串;有效而方便地使用数组;在调用函数时能获得1个以上的结果;能直接处理内存单元地址等。掌握指针的应用,可以使程序简洁、紧凑、高效。每一个学习和使用C语言的人,都应当深入地学习和掌握指针。
概述
新知讲授
四
知识点1:指针的概念
1、内存单元地址与内容
例如:
int k;
定义一个变量
编译系统根据定义的变量类型分配一定长度的空间
程序编译
int型:4字节
char型:1字节
float型:4字节
double型:8字节
第1个字节 第2个字节 第3个字节 第4个字节
地址 1000 1001 1002 1003 内存单元地址
空间 内存单元内容
整型变量“k”在内存中的存储空间
新知讲授
四
知识点1:指针的概念
1、内存单元地址与内容
设有语句:
int i; //编译时系统分配2000~2003四个字节给变量i。
printf(“%d”,i);
/*找到变量i的地址2000,然后由2000开始的四个字节中取出数据(即变量值),将其输出。*/
scanf(“%d”,&i);//把从键盘输入的值送到地址为2000开始的整型存储单元中。
变量名 i
地址 2000 2001 2002 2003
存储单元
在编译时确定变量名与地址的对应关系
新知讲授
四
知识点1:指针的概念
2、指针与指针变量的概念
#include <stdio.h>
main()
{ int i;
float j;
double y;
char c;
int *p1;//定义了指向整型变量的指针
float *p2;
double *p3;
char *p4;
printf("%d,%d,%d,%d
",sizeof(i),sizeof(j),sizeof(y),sizeof(c));
printf("%d,%d,%d,%d
",sizeof(p1),sizeof(p2),sizeof(p3),sizeof(p4)); }
【定义】
“指针”即“内存地址”
“指针变量”即“用来存放这些内存地址的变量”
【特点】
不同类型的指针变量所占用的存储空间长度是“相同的”
而存放数据的变量因数据的类型不同,所占用的存储空间长度是“不同的”。
新知讲授
四
知识点1:指针的概念
3、变量的直接访问方式和间接访问方式
(1)直接访问方式
例如:float x=123.45; //在内存中占用4字节的空间
变量名 x
使用“变量名”直接对存储空间进行访问,即“直接访问方式”
地址 2060 2061 2062 2063
存储单元 123.45
变量名与地址建立了逻辑关系
这个存储空间的首地址就是变量的地址,即“指针”
新知讲授
四
知识点1:指针的概念
3、变量的直接访问方式和间接访问方式
(2)间接访问方式(如下图所示)
变量名 x
存储单元内容 123.45
地址 2060 2061 2062 2063
定义一个指针变量p,用于存储变量x的地址,可称为“指针p指向x”
p
*p
将变量x的地址2060存入指针变量p,即p的值为2060,此时可通过p找到变量x的地址,从而找到x的值。
新知讲授
四
知识点1:指针的概念
3、变量的直接访问方式和间接访问方式
(2)间接访问方式
如右简易图所示,其中“*”是指针运算符,也称为“间接访问”运算符。
“*p”表示指针变量p所指向的变量。
若要改变x变量的值,也可以通过改变“*p”的值来实现。
如执行“*p=47;”,则此时“x=47”。
p x
123.45
*p
新知讲授
四
知识点2:指向简单变量的指针
1、定义一个指针变量
(1)一般形式:
类型标识符 * 指针变量名;
int * pointer_1, * pointer_2;
“基类型”。指针变量的基类型用来指定此指针变量可以指向的变量的类型
“*”表示该变量为指针型变量。指针变量名则不包含“*”
用户自定义的“指针变量名”
新知讲授
四
知识点2:指向简单变量的指针
1、定义一个指针变量
(2)在定义指针变量时要注意:
指针变量前面的“*”表示该变量为指针型变量。指针变量名则不包含“*”。
在定义指针变量时必须指定基类型。一个变量的指针的含义包括两个方面,一是以存储单元编号表示的纯地址(如编号为2000的字节),一是它指向的存储单元的数据类型(如int,char,float等)。
类型标识符 * 指针变量名;
*pointer_1; //企图定义pointer_1为指针变量。出错
int *pointer_1; //正确,必须指定指针变量的基类型
新知讲授
四
知识点2:指向简单变量的指针
1、定义一个指针变量
(2)在定义指针变量时要注意:
如何表示指针类型。指向整型数据的指针类型表示为“int *”,读作“指向int的指针”或简称“int指针”。
指针变量中只能存放地址(指针),不要将一个整数赋给一个指针变量。
属于同类型的指针变量可以相互赋值。
类型标识符 * 指针变量名;
int *pointer_1=3; //企图将一个整数赋给指针变量pointer_1
int *pointer_1=&a; //将变量a的地址赋给指针变量
int *p1,*p2;p1=&a;p2=p1; //将p1指向的地址赋给p2,p1、p2均指向&a
新知讲授
四
知识点2:指向简单变量的指针
2、指针变量的引用
① 给指针变量赋值。
② 引用指针变量指向的变量。
③引用指针变量的值。
int a, *p;
p=&a; //把a的地址赋给指针变量p ①
printf("%d",*p); //以整数形式输出指针变量p所指向的变量的值,即a的值 ②
*p=1; //将整数1赋给p当前所指向的变量,由于p指向变量a,相当于把1赋给a,即a=1 ②
printf("%o",p); //以八进制形式输出指针变量p的值,由于p指向a,相当于输出a的地址,即&a ③
要熟练掌握两个有关的运算符:
“&”取地址运算符。&a是变量a的地址。
“*”指针运算符(或称“间接访问”运算符),*p代表指针变量p指向的对象。
新知讲授
四
知识点2:指向简单变量的指针
例8-1:通过指针变量访问变量
#include <stdio.h>
main( )
{ int a,b,*p1,*p2; //p1、p2为指向整型变量的指针
float x,y,*q1,*q2; //q1、q2为指向实型变量的指针
a=123; b=45;
x=1.25; y=-0.98;
p1=&a; //p1指向变量a
p2=&b;
q1=&x;//q1指向变量x
q2=q1;//q2指向变量x
printf("a=%d, b=%d
", a,b );
printf("*p1=%d, *p2=%d
", *p1,*p2 );
printf("x=%f, y=%f
", x,y );
printf("*q1=%f, *q2=%f
",*q1,*q2 ); }
123
45
p1
p2
a
b
*p1
*p2
123
-0.98
q1
x
y
q2
新知讲授
四
知识点2:指向简单变量的指针
例题:通过指针变量访问整型变量
#include <stdio.h>
main()
{ int a=100,b=10;
//定义整型变量a,b,并初始化
int *pointer_1,*pointer_2;
//定义指向整型数据的指针变量pointer_1, pointer_2
pointer_1=&a; //把变量a的地址赋给指针变量pointer_1
pointer_2=&b; //把变量b的地址赋给指针变量pointer_2
printf("a=%d,b=%d
",a,b); //输出变量a和b的值
printf("*pointer_1=%d,*pointer_2=%d
",*pointer_1,*pointer_2);
//输出变量a和b的值
}
pointer_1 a
&a → 100 *pointer_1
pointer_2 b
&b → 10 *pointer_2
新知讲授
四
知识点2:指向简单变量的指针
例题:输入a和b两个整数,按先大后小的顺序输出a和b。
#include <stdio.h>
main()
{ int *p1,*p2,*p,a,b; //p1,p2的类型是int *类型
printf("please enter two integer numbers:");
scanf("%d,%d",&a,&b); //输入两个整数
p1=&a; //使p1指向变量a
p2=&b; //使p2指向变量b
if(a<b) //如果a<b
{ p=p1;p1=p2;p2=p;} //使p1与p2的值互换
printf("a=%d,b=%d
",a,b); //输出a,b
printf("max=%d,min=%d
",*p1,*p2); //输出p1和p2所指向的变量的值
}
新知讲授
四
知识点2:指向简单变量的指针
例题:输入a和b两个整数,按先大后小的顺序输出a和b。
解题思路:不交换整型变量的值,而是交换两个指针变量的值(即a和b的地址)。
p1 a
&a → 5
p2 b
&b → 9
p
交换前 交换后
p1 a
&b 5
p2 b
&a 9
p
a和b的值并未交换,它们仍保持原值,但p1和p2的值改变了。
实际上,第9行可以改为{p1=&b; p2=&a;}即直接对p1和p2赋以新值,这样可以不必定义中间变量p,使程序更加简练。
if(a<b) //如果a<b
{ p=p1;p1=p2;p2=p; } //使p1与p2的值互换
师生互动
五
指针密室逃脱——你能帮程序逃出去吗?
师生互动
五
指针密室逃脱——你能帮程序逃出去吗?
【互动规则】
小组讨论3分钟
每组派代表在黑板上写出关键代码
最快完成的小组获得"指针大师"称号
基础任务: 进阶任务
定义指针变量p1和p2
让p1指向a,p2指向b
输出p1和p2的值 不直接交换a和b的值
只通过交换指针p1和p2的指向
实现输出时"先大后小"
随堂练习
六
1.以下关于指针的说法正确的是( )
A. 指针变量存储的是变量的值
B. 指针变量存储的是变量的地址
C. 指针变量可以直接存储整型数据
D. 指针变量的大小与指向的数据类型无关
答案:B
解析:指针变量专门用于存储内存地址,即变量的地址。
随堂练习
六
2.若有定义int a = 10, *p = &a;,则*p的值是( )
A. a的地址
B. 10
C. p的地址
D. 不确定
答案:B
解析:*p表示取指针p所指向的变量的值,即a的值10。
随堂练习
六
3.若有int a = 5, *p = &a;,则*p = *p + 1;执行后a的值是( )
A. 5
B. 6
C. p的地址加1
D. 不确定
答案:B
解析:*p = *p + 1等价于a = a + 1,所以a变为6。
随堂练习
六
4.设有定义“int a=4;”,则以下定义指针变量的语句正确的是( )
A. int p = &a;
B. int *p = a;
C. int *p = &a;
D. int &p = *a;
答案:C
解析:定义指针变量需要在变量名前加*,且初始化时应赋地址值。
随堂练习
六
5.若有int a = 3, b = 5, *p = &a, *q = &b;,则*p + *q的值是( )
A. a和b的地址之和
B. 8
C. 3
D. 5
答案:B
解析:*p是3,*q是5,所以*p + *q等于8。
随堂练习
六
6.以下程序段的输出结果是( )
#include<stdio.h>
main()
{
int a = 10, *p = &a;
*p = 20;
printf("%d", a);}
答案:20
解析:通过指针p修改了a的值,所以a变为20。
随堂练习
六
7.若有int a = 8, *p = &a;,则p和&a的关系是( )
A. p的值等于&a的值
B. p的值等于a的值
C. *p的值等于&a的值
D. *p的值等于p的值
答案:A
解析:p存储的是a的地址,所以p的值等于&a的值。
随堂练习
六
8.以下程序段的输出结果是( )
#include<stdio.h>
main()
{
int a = 5, b = 10, *p = &a;
p = &b;
printf("%d", *p);
}
答案:10
解析:p先指向a,后改为指向b,所以*p输出b的值10。
课堂小结
七
谢谢
EV录屏5.4.2软件录制
Lavf58.33.100
本视频由湖南一唯信息科技开发的EV录屏软件录制, www.ieway.cn
EV录屏5.4.2软件录制
Lavf58.33.100
本视频由湖南一唯信息科技开发的EV录屏软件录制, www.ieway.cn
EV录屏5.4.2软件录制
Lavf58.33.100
本视频由湖南一唯信息科技开发的EV录屏软件录制, www.ieway.cn
EV录屏5.4.2软件录制
Lavf58.33.100
本视频由湖南一唯信息科技开发的EV录屏软件录制, www.ieway.cn
$