指针教学课件_第1页
指针教学课件_第2页
指针教学课件_第3页
指针教学课件_第4页
指针教学课件_第5页
已阅读5页,还剩86页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

r

第8章指针

8」指针的概念

8.2指针运算符和指针变量的初使化

8.3数组的指针

8.4用指针处理字符串

8.5指针数组

8.6多级指针

点击此处绪束放映

指针(Pointers)是C语言的一个重要

概念,也是一种重要数据类型,是C语言

的重要特色之一。

点击此处结束放映◄►

zjgaEHBHML田底瞽那

8.1指针的概念■

8.1.1指针和指针变量

如果将某一变量的地址存放到另一个变

量中,那么,变量内容为地址的这个变量,

就叫做指针变量。

如果一个变量的内容是另一个变量的地

址,我们就说第一个变量指向(point)第二

个变量。这第一个变量当然就是指针变量。

点击龈处结束放映YI创A

指针变量pa变量a

地址2000—----------------►5

2000

图8.1指针概念示意图

点击此处结束放映

由于访问数据是通过存放变量地址的变

量,即指针来实现的,所以称这种存取方式

为间接存取方式。

在不使用指针的情况下,是通过变量名

找到存放数据的地址,进而实现的数据存取。

称这种以变量名访问数据的方式为直接存取

方式。

对于数组来说,它占用一个连续的内存

空间。其中第一个存储单元的地址,称为数

组的首地址。数组的每个元素,占用一定数

量的单元。对于一定数据类型的数组,每个

数组元素的地址也是确定的,并且不难从其

首地址计算出来。

812指针变量的定义

指针变量定义踣句w一般格式为:

数据类型*指针变量名;

例8.1.1下面是两个指针变量定义语句:

char*p;

int*a,*b;

第一个语句说明,变量P是指向字符型

数据的指针变量;第二个语句说明,变量a

和b是指向整型数的指针变量。

8.2指针运算符和指针变量的初始化

821指针运算符

1.取地址运算符“&”

它的运算功能是获取操作对象(变量)

在计算机内的存储器地址。取地址运算表达

•式的一般形式为:

&变量

2.取内容运算符

它运算的功能是获取操作数(指针变量)

所指的地址的内容。取内容运算表达式的一般

形式为:

指针变量

822指针变量的新蛤化

指针变量初蛤化w一般形式为:

数据类型*指针变量名=内存地址;

闭821用已定义W变量x初蛤化指针变量px

(以整型指针变量为囱」o

intx;

int*px=&x;/*指针变量pxW初蛤化*/

例8.2.2用已初始化的或已赋值的指针变

量px,初始化另一个指针变量pa(以整型指

针变量为例)。

intx,pa,*px=&x;

int*pa=px;/*指针变量pa的初始化*/

这里指针变量pa和px必须是相同数据类

型的指针变量。

823指针运算与揖针襄达式

指针变量是可以运算w。但是,指针运算

有它目己W特殊W地方。一个变量或数据所占

用的内存单元数是瓯着数据类型W不同而不同

W。指针其是指向变量WW第一个字节W地址,

即变量W苜地址。本节要对这些特殊W地方迸

行讨论。

1.指针赋值

2.指针的算术运算

(1)加一衣减'一运算

(2)向解斜加减值意整微

3.指针的比较运算

824用指针处理简单变黄

在学习了指针的基本概念和基本运算

后,下面通过几个苗子了解指针变量ww

用o

例823设有整型变量abc=67,应用

指向该变量的指针,将变量abc的值赋给变

量val。要求输出变量abc的地址和变量val

的值。

程序如下:

#include"stdio.h"

main()

(

intabc=67/abc_addr5val;

abcaddr=&abc;

val=^abcaddr;

printf(nabc_addr=%X\n!\abc_addr);

printf(nval=%d\n!\val);

对程序中下面两个语句作些说明:

abcaddr=&abc;

val=*abcaddr;

这两个语句使用了指针运算符。其中第

一个语句是求变量abc的地址并将结果赋给指

针变量abjaddr;第二个语句是求指针变量

abjaddr所指地址所存储的内容并赋给变量

vaL

在计算机技术中,内存的地址通常用16

进制数表示。所以,在printf()函数中使用了

格式码“%X”,它指示用16进制数输出,其

中X为大写字母,表示地址要用大写字母形式

表示。如果用格式字符“%x",则用小写字母

形式输出地址。

点击此处结束放懿◄a►

下面是运行上述程序时,得到的结果:

abc_addr=FFF4(在不同系统上运行本

程序时,得到的内存地址会不同)

val=67

例8.2.4应用指针变量,将变量a和b的

值进行互换。

我们用直接存取方式做过这个题目,两

个数据交换的核心程序片段是:

c=a;a=b;b=c;

设变量a和b的指针变量分别是pa和pb,则上

面的三个语句,在间接存取方式下,相应为:

c=*pa;*pa=*pb;*b=c;

程序如下:

#include"stdio.h"

main()

inta,b,c;

int*pointer_a=&a,*pointer_b=&b;

printf(nEnter2numbers:");

scanf(n%d%df\&a,&b);

c=*pointer_a;

*pointer_a=*pointer_b;

*pointer_b=c;

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

例825用户输入两个整型数据a和b,程序将

这两个数据按从小到大的顺序输出。同时原

始数据的变量的值保持不变。

开始令指针pa指向变量a,指针pb指向变

量b。如果变量a的值大于变量b的值,则令指

针pa指向变量b,指针pb指向变量a。这样进行

指针指向的交换,可以使指针pa指向数值较小

的变量,指针pb指向数值较大的变量,同时又

不影响变量a和b的数据。所以本程序的关键部

分是两个指针指向的互换:

p=pa;

pa=pb;

pb=P;

程序如下:

#include"stdio.h"

main()

(

inta,b,*pa=&a,*pb=&b,*p;

〃定义变量和指针

nf

scanf(%d%d\&a9&b);〃输入数据a和b

printf("*pa=%djpb=%d\n",*pa/pb);

〃输出指针所指变量的内容

if(*pa>*pb)〃令指针*pa指向较小的数

P=pa;

pa=pb;

pb=P;

)

printf("*pa=%d/pb=%d\n"『pa9*pb);

//输出指针所指变量的内容

n!

printf(a=%d5b=%d\n\a9b);〃输出数据a和b

8.3数组的指针

本节介绍如何用指向数组的指针实现

对数组的操作。

<^A

831指向一维政组的揖针

指针和数组之间有着非常密切w关系:。

因为数组名,不用下标)就是该数组w苜地

址。所以也就是指针。

如果指针变量W值为数组W首地址,并

且通过这个指针采计算其他元素W地址或防

问其他数组元素,如称这个指针为数组的基

指针。设指针变量pa为数组aW数组基指针

后,阳有以下四种方法弓/用数组元素a[k]:

*(pa+k)

*(a+k)

pa[k]

a[k]

例8.34用上面介绍的四种不同方法访问

数组元素。

#include"stdio.h"

main()

,・

i(三vdps«tuKd

p%七ua

inpJWId

}

(++I曲vlioHOJ

sHvd米

HcJUJ

苔*7IOTSVJS.

printf(n%dH/(pa+i));

printf(n\nn);

程序中四个prints)的输出是一样的。程

序输出如下:

0000

1111

2222

3333

4444

点击此处结束放映

832指向二维数组的指针

为了返好地理解并掌握二维数组指针的使

用,苜先要搞清楚二维数组在内存中的地址问

题。以下面定义w数组为例,说明二维数组w

地址问题:

inta[3][4]={{l,2,3,4},{5,6,7,8},{9J0Jl42}};

上述二维数组W地址关系:,如图8.2所示。

设:

inta[3][4],*p=a,*q=a[O],

*qa=&a[O][0];

a►l---------------a[0]-----------------

Pqa[0][0]

a[O]+lq+1―►a[0][l]

a[0]

a[0]+2q+2―►a[0][2]

a[0]+3q+3―►a[0][3]

a川》

a+l►----------------

p+la[l][0]

a[l][l]◄—&a[l][l]

a[l]

a[l][2]

a[l][3]

a

a+2►----------------L^J»

P+2a[2][0]

a[2][l]

a[2]

a[2][2]

a⑵[3]

图8.2二维数组地址示意图

点击此处结束放映

下面开始学习二维数组指针变量的使用。

1.指针变量指向二维数组的元素

二维数组指针变量定义语句的一般形式为:

数据类型*指针变量=&数组名[下标][下标];

数据类型*指针变量=数组名[下标];

赋值语句的一般形式为:

点击此处结束放映

指针变量=&数组名[下标][下标];

指针变量=数组名[下标];

当指针变量指向元素后,引用该元素的方

法为:

*指针变量

经过控制(如对指针变量的简单运算),

可以指向相关的元素。如果把指针变量设置

为二维数组的基指针,则对元素的引用

方法是:

*(基指针变量+i*列数+j)

点击此处结束放映◄合►

例8.3.2有如下的二维矩阵

1234

。二5678

9101112

计算其各行之和。

方案一:设置二维数组a的基指针q。

程序如下:

点击此处结束放映

main()

inta[][4]={l,2,3,4,5,6,7,8,9,10,H,12};

inti,j,sum,*q=a[O];/*定义基指针*/

for(i=0;i<3;i++)

点击此处结束藏睽◄合►

sum=O;

for(j=0;j<4;j++)

sum+=*(q+i*4+j);/*用基指针弓I

用数组元素*/

nn

printf(sum%d=%d\n49sum);

程序的输出是:

sum0=10

suml=26

sum2=42

方案二:设置元素指针。

程序如下:

#includenstdio.hn

main()

inta[][4]={l,2,3,4,5,6,7,8,9JOJIJ2};

inti,j,sumJq;

/*定义int类型指针q*/

for(i=0;i<3;i++)

sum=0;

q=&a[i][OJ;

/*指针q指向数组元素a[i][0]*/

forQ=0;j<4;j++)

sum+=*q++;/*引用指针q指向的元素*/

printf(Msum%d=%d\nn4,sum);

二维数组在内存存储的形式,实际上一

个线性表。为应用这一性质,定义数组指针

指向数组的第一个元素,然后,通过对指针

加一运算,使指针连续指向下一个元素,实

现访问各个元素的目的。程序如下:

<©A

#includenstdio.hn

main()

(

inta[][4]={l,2,3,4,5,6,7,8,9,10,H,12);

intijsumjq;/*定义int类型指针q*/

q=&a[O][0];/*指针q指向数组的第一个元

素*/

for(i=0;i<3;i++)

sum=O;

forg=0;j<4;j++)

sum+=*q++;/*指针q指向下一个

元素*/

n!

printf(sum%d=%d\n\i5sum);

点击此处结束放映◄合►

2.指向二维数组的某个一维数组的指针变量

定义这种指针的格式是:

数据类型(*指针变量)[列数];

数据类型(*指针变量)[列数上二维数

组名;

也可以用赋值的方式对指针变量赋值:

指针标量=二维数组名;

设指针变量指向二维数组的首地址,根

据以上的分析,可以得到如下的结论:

二维数组第i行对应的一维数组首地址为:

*(指针变量+i)

二维数组第i行第j列元素的地址为:*(指

针变量+i)+j

二维数组第i行第j列元素的引用为:

*(*(指针变量+i)+j)

例833对例832用指向二维数组的某

个一维数组的指针变量重新编程。

本例需注意两点:按要求定义指针和正

确赋值;正确引用二维数组的元素。

程序如下:

#include"stdio.h"

main()

点击此处结束放映◄合►

inta[][4]={1,2,3,4,16,7,8,9JOJI,12};

intij,sum;

intrp)[4]=a;/*定义指针

变量,并初始化*/

for(i=0;i<3;i++)

sum=O;

for(j=0;j<4;j++)

_sum+=*(*(p+i)+j);/*引用

元素*/

printf(nsum%d=%d\nn4,sum);

点击此处结束放映◄台►

例8.3.4有一个3X3的矩阵a。要对它进

行转置操作。所谓转置,就是进行矩阵元素

的行列号的对换。例如,元素a(i,j)转换为

整个转置过程,要求用指针实现。已

知矩阵a如下:

123

。二456

789

点击此处结束放映

W1r9MF

7、>

程序的结构可分为以下几块:

⑴对照物M迷行初蟾化;

(2)给熬痴的猾那赋他:

(3)迷行缴粮无春的转量;

⑷输出辂累教俎。

程序如下:

#include<stdio.h>

main()

'、蛾处结束放映

inta[3][3]={/*数组初始化*/

1,2,3,

4,16,

7,8,9);

inti』k,(*p)[3]=a;

矩阵指针变量初始化*/

for(i=0;i<3;i++)

for(j=i;j<3;j++)

k=*(*(p+i)+j);/*矩阵元素转

置*/

*(*(p+i)+j尸*(*(P+j)+i);

*(*(p+j)+i尸k;

for(i=0;i<3;i++)/*输出结果矩阵*/

{

printf(u\nn);

for(j=0;j<3;j++)

printf(n%d”,*(*(p+i)+j));

点击此处结束放映◄合►

程序输出转置后的矩阵为:

147

258

369

8.4用指针处理字符串

当一个字符串存入字符型数组,用一

字符型指针变量指向这个字符数组后,处

理数组中的字符串或其中的某些字符,就

是处理一维数组的元素。关于一维数组元

素的处理,在前面已经介绍过,本节就不

再重复了。本节着重介绍字符串常量的情

况。

定义指针变量,使其指向字符串常量,

有两种格式:带初始化的和不带初始化的。

(1)char*相针变量=有符串考量,.

(2)char佻猾针变量/

指针变量=字符串常量;

例841利用字符指针输出字符串,输

出部分字符串。

点击此处结束放映◄►

程序将两个字符指针分别指向两个字符串

常量“stringl”和“andstring?”。通过对字符

指针变量的运算

str2=str2+3;

使指向字符串“andstring?”的指针str2指

向字符串的空格字符。然后,用指针输出两

个字符串。程序如下:

点击此处绪,◄给►

#includenstdio.hn

main()

char^strl=nstringln;

char*str2;

str2=nandstring!H;

str2=str2+3;

n!

printf(%s,%s\n\strl5str2);

点击此处结束放映◄合►

程序的输出为:

stringl,string!

用字符数组表示字符串和用指针表示字

符串,还有某些不同。例如,字符串常量可

以直接赋给指针变量,但不能赋给数组。例

如:

chara[10],*p;

p=Habcdn;是正确的语句

==""a="abcd”;是错误的语句

字符数组在编译阶段被分配好内存空

间,数组已有确定的地址,数组名相当于

一个常量。因此,它可以被引用,但不能

改变。

点击此处缢,

字符指针变量在定义时分配内存空间,

在没有赋值之前,其内容还没有确定,即并

没有指向具体的字符串。可以在以后任何地

方对它赋值。指针变量的值(地址)是可以

改变的。

8.5指针数组

如果数组元素中存储的是地址,这时,

每个数组元素相当于一个指针变量。这样的

数组就叫做指针数组。指针数组是一种数据

类型,使用指针数组时,要先进行定义。指

针数组定义语句的一般形式是:

数据类型*数组名[长度1][长度2]

<合4

例如,下面定义指针数组X为长度为10的

整型指针数组:

int*x[10];

它的10个元素能够存储10个整型数据的

地址。

指针数组在定义的同时也可以进行初始

化。例如,

char^pa[2]={nabcdeff\nwxyzn);

点击此处缢束放映

初始化的结果是指针数组元素pa[O]指向字符

串aabcdePopa[l]指向字符串“wxyz”。

例8.5」通过指针数组pa[]输出一个整型二维

数组a[][]各元素的值。

晅针数组pa[]指向数组a[][]的关系如图8.3所

ZjSO

pa[2]a[2][3]

pa[O]

pa[l]

图8.3例8.5.1指针数组示意图

程序如下:

#include<stdio.h>

mainQ

inta[2][3]={1,3,5,7,9,11};

int*pa[2],i,j;/*定义指针数组*/

pa[O]=a[O];/*为指针数组赋值*/

pa[l]=a[l];

for(i=0;i<2;i++)

for(j=0;jv3;j++,pa[i]++)/*

通过指针数组访问数组元素*/

printf(na[%d][%d]=%d\nH,i,j,

点击此处结束放嬲◄►

程序中,整型指针数组pa的赋值语句:

pa[O]=a[OJ;

表示将数组a第0行元素的首地址赋给指针数

组pa[O]。也就是将数组元素a[0][0]地址赋给

指针数组pa[O]。因此,上面的语句还可以写

成:

pa[O]=&a[O][O];

程序通过指针数组pa输出了数组a的内容时,

我们使用了表达式:

pa[i]++

来修改指针数组pa所指向的数据元素。例如,

当i=0时,通过pa[i]++便得到数组元素

a[0][0],a[0][l]^a[0][2]的地址。

程序的输出为:

a[O][O]=l

a[0][l]=3

a[0][2]=5

a[l][0]=7

a[lHl]=9

a[l][2]=ll

指针数组比较适合于处理多个字符串,使字

符串的处理更方便。

例8.5.2有四个字符串,用指针数组按由小到

大的顺序进行排序。

排序前和排序后的指针和字符串情况如图8.4

所示。本题主要要做的是:

(1)范文相针裁粗不初胎化;

(2)确灵椰本事法,例电用第七章介殆的

算法一/

针衮换;

(4)量后输出排格的转累。

p[4]p[4]

first"

second"

third"

fourth"

(a)排序前(b)排序后

图8.4例8.5.2指针数组示意图

程序如下:

#includenstdio.hn

#includenstring.hn

main()

(

char

*P[]={"行rst”Jsecod”Jthird”Jfourth"};

intij;

char*pt;

for(i=0;i<3;i++)

(

forg=i+l;j<4;j++)

(

if(strcmp(p[j],p[i])<0)

pt=p[i];

P[i]=p[jl;

P[j]=pt;

for(i=0;i<4;i++)

puts(p[i]);

程序的输出如图8.4(b)所示。

点击此处结束放映◄合►

8.6多级指针

如果一个指针变量存储的是另一个指针

变量的地址,这样的指针变量称为指针的

指针,也叫做多级指针。多级指针是一个

指针链。图8.5所示是一级指针和多级指针

(图中表示的是二级指针)的示意图。

指针变量

指针指针变量

图8.5一级指针和多级指针示意图

点击此处结束放映◄合►

r

图8.5一级指针和多级指针示意图

二级指针变量定义格式如下:

数据类型"指针变量名;

例如,下面的语句定义实型变量a的

一级指针和二级指针:

floata,*pa,**ppa;

点击此处结束放映◄合►

定义多级指针变量时也可以进行初始化,

其格式是:

数据类型"指针变量名=初值;

例如,下面的语句给前面例子中变量a

的指针赋初值:

floata,*pa=&a,**Ppa=&pa;

二级指针变量也可以用赋值方式使它

指向某个一级指针。赋值格式为:

点击龈处结束放映YI创A

二级指针变量=&一级指针变量;

多级指针定义和赋值后,多级指针的引用,

与一级指针基本上一样的。例如,有下面的

定义语句:

floata=1.23,*pa=&a,**ppa=&pa;

*pa代表变量a;

*ppa代表指针变量pa;

**ppa代表变量a。

例861设有一整型变量a,它的值为11。

该变量的一级指针、二级指针和三级指针变

量分别%pa,ppa和pppa。程用使用这些指

针变量输出变量a的值和这三个指针的内容

(即地址)。

程序如下:

#includenstdio.hn

main(

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论