内容正文:
8单元
指针
C语言程序设计任务驱动式 教程(第2版)
工业和信息化人才培养规划教材
国家精品资源共享课程配套教材
高职高专计算机系列
人 民 邮 电 出 版 社
前面曾经提出如果定义一个变量,就会在内存开辟空间存放变量的数据。在程序中引用变量名来使用这个内存空间,而编译时计算机则使用内存的地址来引用它。如果定义了一个整型变量int sum=0;,内存就开辟了一个整型变量的空间存放sum的值。
那么每一个变量都有一个对应的内存地址,还可以定义一个存放内存地址的变量,就是指针,存储在指针中的地址是另一个变量的首地址。可以定义指针变量p,存放变量sum的首地址,变量sum是一个值为0的整型变量。存储在p中的地址是sum的第一字节的地址。
指针是C语言中最强大的工具之一,是精华所在,也是最容易让人困惑的主题。只有在正确理解指针概念的基础上,才能熟练运用指针。
问题引入
Question Introduction
目录导航
任务1 交换两个变量的值—指针概述
任务2 3个数排序—指针变量作为函数参数
思考与训练
单元小结
任务3 字母放大镜—通过指针访问数组
任务1 交换两个变量的值—指针概述
通过编程解决两个变量数据交换的问题,这里使用指针变量指向两个整型变量,并完成交换。
工作任务
任务1 交换两个变量的值—指针概述
思路指导
定义变量:定义两个整型变量int a,b。
定义指针:定义两个指针变量int *p1, *p2。
输入:a、b的值。
交换:将两个指针指向两个整型变量,运用指针完成a与b值的交换。
相关知识
(一)指针变量的定义
格式:基类型 *指针变量名
例如:
int *p1; (定义p1为指向整型变量的指针变量)
char *p2; (定义p2为指向字符型变量的指针变量)
float *p3; (定义p3为指向实型变量的指针变量)
int、char、float分别称为指针变量p1、p2、p3的“基类型”,“基类型”意为指针变量所指变量的类型,不是指针变量的类型。
(二)指针变量赋值
1.通过取地址运算符(&)获得地址值
单目运算符(&)用来求出运算对象的地址,利用它可以把一个变量的地址赋给指针变量。
例如:
int a=5, *p, *q;
p=&a;
scanf ("%d",&a);和scanf("%d",p);是等价的。
可以通过赋值运算,把一个指针变量中的地址值赋给另一个指针变量,从而使这两个指针变量指向同一地址。例如,若有上面的定义,则语句 q=p;使指针变量q中也存放了变量a的地址,也就是说,指针变量p和q都指向了整型变量a。
注意:赋值号两边指针变量的基类型必须相同。
2.通过指针变量获得地址值
(二)指针变量赋值
3.给指针变量赋“空”值
格式:p=NULL;
NULL是在stdio.h头文件中定义的预定义符,因此在使用NULL时,应该在程序的前面出现预定义行:# include "stdio.h"。
(三)指针变量的引用
注意,&、*运算符是用在指针变量上的,而不是“位与”和“乘”运算符。&运算符(取地址运算符)表示取变量的地址;*运算符(指针运算符、间接访问运算符)表示访问指针变量指向的变量的值。
任务1 交换两个变量的值—指针概述
任务实施
1.流程图
程序流程图如图所示。
2.程序代码
# include "stdio.h"
Main() {
int a, b, *p1, *p2,p;
printf("请输入a和b:
");
scanf("%d,%d", &a, &b);
p1=&a; p2=&b;
if (a<b) //用指针交换a,b
{p=*p1; *p1=*p2; * p2=p;}
printf ("
a=%d,b=%d
", a, b);
printf ("指针1max=%d, 指针2min=%d
", *p1, *p2);
}
程序运行结果如图8-2所示。
图8-2 任务1运行结果
任务1 交换两个变量的值—指针概述
特别提示
(1)C语言变量“先定义后使用”,指针变量也不例外,为了表示指针变量是存放地址的特殊变量,定义变量时要在变量名前加“*”号。
(2)指针变量的基类型(简称:指针变量类型)为指针变量所指向数据的类型。
我们知道,整型数据占用2字节,浮点数据占用4字节,字符数据占用1字节。指针变量类型使得指针变量的某些操作具有特殊的含义。比如,pt1++;不是将地址值增1,而是表示将地址值+2(指向后面一个整数)。
(3)指针变量的基类型实际上是指针变量所指向空间存储的数据的类型。
(4)本程序中定义语句中的*p1和*p2是定义两个指