第7章 指针和指针变量

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

第七章指针

知识目标:

●理解指针和指针变量的概念

●掌握指针变量的定义与应用

●理解指针与数组名之间的关系

●掌握指针与数组的综合应用

●掌握指针与字符串处理的设计方法

●了解指针在函数中的应用

能力目标:

●理解指针的作用

●会通过指针类型使函数返回多个值

●会通过指针访问数组元素

●会使用指针作为数组的形参、实参

●会通过指针访问字符串元素

7.1 指针的基本概念

指针是C语言中的重要概念,也是C语言的重要特色。使用指针可以有效地表示复杂的数据结构;使用指针可以能方便地使用数组、字符串;使用指针可以使程序更加简洁、紧凑、高效。

计算机硬件系统的内存储器中,拥有大量的存储单元(容量为1字节)。为了方便管理,必须为每一个存储单元编号,这个编号就是存储单元的“地址”。每个存储单元都有一个惟一的地址。

变量的实质是计算机给程序分配的一定数量的存储空间,因此变量也有地址,scanf (“%d”,&a)中的&,本质上就是取出a的地址,使得输入的数据根据地址存放到相应的存储空间。

那什么是指针呢?指针其实就是地址,二者同一个概念的两种说法。只不过指针更形象一些,就像一个针一样,可以指向某个地方。

变量的指针就是变量的地址。存放变量地址的变量是指针变量。即在C语言中,允许用一个变量来存放指针,这种变量称为指针变量。因此,一个指针变量的值就是某个变量的地址或称为某变量的指针。

指针与指针变量的关系如图7-1所示。

图7-1 指针与指针变量的关系

有了指针变量,我们访问变量就有了两种方式,直接访问和间接访问。

直接访问:按变量名存取变量值,比如:i=3。

间接访问:通过存放变量地址的变量去访问变量,比如图7-1中,i_pointer中存放了i的地址,我们就可以通过它先读取i的地址找到i变量的位置,然后读取i变量的值。

为了表示指针变量和它所指向的变量之间的关系,在程序中用“*”符号表示“指向”,“*”也叫作指针运算符(去内容运算符),是一个与“&”互为相反的运算符。

例如,i_pointer 代表指针变量,而*i_pointer是i_pointer 所指向的变量。因此,下面两

个语句作用相同:

i=3;

*i_pointer=3;

第二个语句的含义是将3 赋给指针变量i_pointer 所指向的变量。

7.2指针变量的定义与引用

7.2.1指针变量的定义

对指针变量的定义包括三个内容:

(1) 指针类型说明,即定义变量为一个指针变量;

(2) 指针变量名;

(3) 变量值(指针)所指向的变量的数据类型。

其一般形式为:

类型说明符*变量名;

其中,*表示这是一个指针变量,变量名即为定义的指针变量名,类型说明符表示本指针变量所指向的变量的数据类型。

例如:int *p1;

表示p1 是一个指针变量,它的值是某个整型变量的地址。或者说p1 指向一个整型变量。至于p1 究竟指向哪一个整型变量,应由向p1 赋予的地址来决定。

再如:

int *p2; /*p2 是指向整型变量的指针变量*/

float *p3; /*p3 是指向浮点变量的指针变量*/

char *p4; /*p4 是指向字符变量的指针变量*/

应该注意的是,一个指针变量只能指向同类型的变量,如P3只能指向浮点变量,不能时而指向一个浮点变量,时而又指向一个字符变量。

知识延伸

虽然内存地址是没有类型区别的,指针变量既然存放的是指针(地址),按理说可以存放任何类型变量的地址,但为了程序处理方便,指针变量也限定了类型,一旦没有一个指针变量定义成了什么类型,他就只能存放相应类型的变量的地址(或者说指向相应类型的变量)。

7.2.2指针变量的引用

知识讲解

在引用指针变量是,可能又三种情况:

(1)给指针变量赋值。如:

p=&a;//把a的地址赋给指针变量p

指针变量p的值是变量a的地址,p指向a。

(2)引用指针变量指向的变量。

如果已经执行了“p=&a;”则

printf(“%d”,*p);

其作用是以整数形式输出指针变量p所指向的变量的值,即变量a的值。

如果有以下赋值语句:

*p=6;

表示将整数6赋值给p当前所指向的变量,如果p指向了a,则相当于把6赋值给a,即“a=6;”。

(3)引用指针变量的值。如:

printf(“%o”,p);

作用是以八进制的形式输出p的值,如果p指向了a,就是输出a的地址,即&a。

注意:指针运用中,要熟练掌握两个有关的运算符:

1) &:取地址运算符。

2) *:指针运算符(或称“间接访问”运算符)。

案例分析

题目描述:

例7.1 输入a和b两个整数,按先大后小的顺序输出a和b。

程序代码:

#include

void main()

{ int *p1,*p2,*p,a,b;

scanf(″%d,%d″,&a,&b);

p1=&a;p2=&b;

If(a

{p=p1;

p1=p2;

p2=p;

}

printf(″a=%d,b=%d\n″,a,b);

printf(″max=%d,min=%d\n″,*p1,*p2);

运行结果:

5,9

a=5,b=9

max=9,min=5

程序注解:

(1)在分析有关指针的程序时,画图是很好的方法。