《C语言程序设计》课件第6章_第1页
《C语言程序设计》课件第6章_第2页
《C语言程序设计》课件第6章_第3页
《C语言程序设计》课件第6章_第4页
《C语言程序设计》课件第6章_第5页
已阅读5页,还剩56页未读 继续免费阅读

下载本文档

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

文档简介

6.1指针的基本概念

6.2指针变量的运算

6.3指针与数组6.4指针与字符串小结习题实训

6.1.1什么是指针

在计算机中,所有的数据都是存放在存储器中的。

6.1.2指针的定义及初始化

和一般变量一样,对指针变量的类型说明也包括三个方面的内容:指针类型说明、指针变量名和变量值(指针)所指向的变量的数据类型。6.1指针的基本概念1.指针变量的声明

2.指针变量的初始化

6.1.3指针运算符

指针有两种运算符:一是取变量地址的操作运算符“&”;另一个是间接访问操作运算符“*”。

【例6-1】

指针的运算。

通过输出语句可以看到,指针变量pa取得了整型变量a的地址,与&a的值相同,而 *pa取得的是变量a的值,与a的值相同,而且可以重新为变量a赋值。该例子还说明“*”

运算符不仅可以获得变量a的值,而且可以修改变量a的值。程序的运行结果如图6-1所示。图6-1例6-1程序的运行结果

6.1.4程序案例

【例6-2】用指针实现两个数据的交换。要求从键盘上输入两个数,输出交换后的两个数。

实现数据交换的程序总是类似的,需要一个中间变量。本例中,当给第一个数num1赋值20,给第二个数num2赋值40时,程序的运行结果如图6-2所示。图6-2例6-2程序的运行结果

【例6-3】

用指针求出三个数中最大的。要求从键盘上输入三个整数,输出此三个数中的最大数。

当输入的三个数分别是12、-45、23时,程序运行后输出的最大数为23。程序的运行结果如图6-3所示。图6-3例6-3程序的运行结果6.2.1赋值运算

赋值运算有以下几种形式:

(1)指针变量初始化赋值。

(2)把一个变量的地址赋予指向相同数据类型的指针变量。

(3)把一个指针变量的值赋予指向相同类型变量的另一个指针变量。6.2指针变量的运算

(4)把数组的首地址赋予指向数组的指针变量。

(5)把字符串的首地址赋予指向字符类型的指针变量。

6.2.2算术运算

1.两指针变量相减

两指针变量相减所得之差是两个指针所指数组元素之间相差的元素个数。

2.使用 ++/-- 将指针递增或递减

6.2.3指针变量的关系运算

两个指针变量在有意义的情况下,可以进行关系运算。

指针变量还可以与0进行比较。设p为指针变量,则p==0表明p是空指针,它不指向任何变量;p!=0表示p不是空指针。空指针是由对指针变量赋予0值而得到的。6.3.1指向数组的指针

指向数组的指针变量称为数组指针变量,它可以指向数组的首地址,也可以指向数组中的某个元素。6.3指 针 与 数 组6.3.2数组指针变量说明的一般形式

数组指针变量说明的一般形式为:

类型说明符*指针变量名;

其中,类型说明符表示所指数组的类型。6.3.3程序案例

【例6-4】使用指针变量为数组赋值并输出数组元素的值。

程序的运行结果如图6-4所示。图6-4例6-4程序的运行结果

【例6-5】使用指针求出数组中最大元素的值。

运行程序时,顺序输入12,89,23,45,65五个数,输出正确的结果:数组中的最大值是89,如图6-5所示。比较用指针和用数组的编程方法可看出,它们是很相似的。图6-5例6-5程序的运行结果

【例6-6】

使用指针对数组中的元素按从小到大的顺序排序,即使用指针实现冒泡排序。

程序的运行结果如图6-6所示。图6-6例6-6程序的运行结果6.4.1字符指针

我们已经知道,字符串实际上就是字符数组,所以指向字符串的指针就是指向字符数组的指针,通过指向数组的指针的偏移可以遍历字符数组即字符串中的各个字符。6.4指针与字符串

【例6-7】

使用字符指针求给出的字符串长度。

程序定义了字符串指针变量msg,并初始化为“EverythingIdo,Idoitforyou!”;定义了计数器count,并赋初值为0;还定义了一个指向字符串的指针变量prt。程序运行结果输出了字符串的长度,如图6-7所示。该例实际上就是字符串长度函数strlen的实现过程。图6-7例6-7程序的运行结果6.4.2字符指针数组

要集中处理多个字符串,如人员名单,可以用二维字符数组来实现。

【例6-8】使用字符指针数组来输出指针数组中各元素指向的内容。

程序的运行结果如图6-8所示,输出了给定的字符串序列。图6-8例6-8程序的运行结果6.4.3程序案例

【例6-9】输入一个字符串,使用字符指针遍历字符串,统计出字符串中大写字母的个数。

当输入字符串 "TheBigBigWorld!" 后运行程序,其结果如图6-9所示。图6-9例6-9程序的运行结果

【例6-10】判断一个字符串是否是回文串,也就是说字符串是否是对称的。

如果输入的是字符数组,则最多可输入Max个字符;如果输入的是字符串,则最多只能输入Max-1个字符,但strlen()取的是字符串的实际长度。程序的运行结果如图6-10所示。图6-10例6-10程序的运行结果

【例6-11】要求输入用户居住的城市的拼音,如果输入的是“Xi’an”,则输出“欢迎你,乡党!”,否则输出“西安欢迎你!”。

程序根据用户的输入,通过字符串比较函数输出不同的信息。程序运行结果如图6-11所示。图6-11例6-11程序的运行结果

指针是一个变量,所以它的声明、引用及初始化与普通变量是相似的,只不过它存储的是另一个变量的地址。指针变量的类型与它指向的变量的类型一致。【小结】一、填空题

1.若有定义:inta[]={12,23,34,45,56},*p=a;,则:*(p+1)的值是

,*(a+1)的值是

2.下列程序段的运行结果是

【习题】main()

{

inta=8,b=9,*p=&a,*q=&b,*t;

t=p;p=q;q=t;

printf("%d,%d,%d,%d\n",a,b,*p,*q);

}3.下列程序段的运行结果是

intf(int*i,int*j){return*i+*j;}

main()

{

inta=3,b=6,c;

c=f(&a,&b);

printf("%d\n",c);

}4.下列程序段的运行结果是

voidf(inti,int*j){i+=*j;*j+=i;}

main()

{

inta=3,b=6;

f(a,&b);

printf("%d,%d\n",a,b);

}5.下列函数的功能是

int*f(int*x,int*y)

{

if(*x<*y)

returnx;

returny;

}6.下列程序段的运行结果是

main()

{

inta[10]={1,2,3,4,5,6,7,8,9,10},*p=&a[3],*q=p+2;

printf("%d\n",*p+*q);

}7.下列程序段的运行结果是

main()

{

inta[10]={1,2,3,4,5,6,7,8,9,10},s=0;

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

s+=*(a+i);

printf("%d\n",s);

}8.下列程序段的运行结果是

main()

{

inta[2][5]={1,2,3,4,5,6,7,8,9,10},*p=a[0];

printf("%d\n",*(p+3));

}

9.若正常执行如下语句后,输出结果是

inta[20],*p1=a,*p2=&a[13];

printf(“%d\n”,p2-p1);

10.p为一个指针变量,将p所指向单元的数据值减1并作为表达式的值的表达式是

11.若指针p指向字符串“ABCDEFGHIJKLMN”,则执行语句printf("%c\n",*(p+7));后,屏幕上显示的是

。二、选择题

1.()提供了一种直接操作内存地址的变量。

A.数组 B.字符串

C.指针 D.变量

2.下面声明一个指向变量num的指针prt的语句中,正确的是()。

A. intnum,*ptr;

ptr=num;

B. intnum,*ptr;

ptr=*num;

C. intnum,*ptr;

*ptr=#

D. intnum,*ptr;

ptr=#

3.已知语句片段:

doublenum,*ptr;

ptr=#

则与*ptr相同的是()。

A. num B. &num

C. *num D. ptr

4.已知:

intdata[]={12,23,34,45},*ptr=data;

下面对data数组元素的值引用不正确的是()。

A. *(ptr+2) B. *ptr

C. ptr++ D. data[3]

5.下列说法正确的是()。

A.在2000,2001,…,2007这8个连续的地址单元中可存放8个数据

B.在2000,2001,…,2007这8个连续的地址单元中可存放8个字符

C.在2000,2001,…,2007这8个连续的地址单元中可存放字符串“ABCDEFGH”

D.在2000,2001,…,2007这8个连续的地址单元中可存放8个整数

6.假定p是一个指针变量,下列指针表达式正确的是()。

A. ++p++ B.

(++p)++

C. ++(p++) D.

p++-=3

7.执行下列程序片段后,变量x的值为()。

intdata[3][2]={{10,20},{1,2},{15,30}};

intx,*ptr;

ptr=&data[0][0];

x=*ptr*(*(ptr+3))*(*(ptr+5));

A. 150 B. 300

C. 600 D. 4008.以下程序的输出结果是()。

#include<stdio.h>

voidmain()

{

inti=2,j=4,k=6;

int*pi=&i,*pj=&j,*pk;

*(pk=&k)=*pi**pj;

printf(“%d”,k);

}

A. 24 B. 12

C. 10 D. 89.下列程序执行的结果是()。

voidmain()

{

inti=2,j=4,**pp,*p;

pp=&p;

p=&i;

p=&j;

printf(“%d,%d”,*p,**pp);

}

A. 2,4

B. 2,2

C. 4,4

D.4,210.下列程序执行的结果是()。

voidmain()

{

char*pc=“Oneworld,onedream!”;

pc=pc+10;

printf(“%s”,pc);

}

A. onedream! B. “onedream!”

C. onedream D.编译出错

11.下列说法不正确的是()。

A.一个数组的地址就是该数组的第一个元素(0号元素)的地址

B.地址0专用于表示空指针

C.地址值0可以用符号常量NULL表示

D.两个指针相同是指它们的地址值相同

12.空指针是指()。

A.无指针值的指针

B.不指向任何数据的指针

C.无数据类型的指针

D.既无指针值又无数据类型的指针

13.下面是一个运行正常的程序中的两条语句:

int*p1=a,*p2=&x;

*p2=*b;

由此可知,变量a和b的类型分别是()。

A.int和int B.int*和int

C.int和int* D.int*和int*

14.要使指针变量p指向一维数组A的第5个元素(下标为4),正确的赋值表达式是()。

温馨提示

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

评论

0/150

提交评论