《C语言程序设计》 课件 蔡玲芳 第七章 指针_第1页
《C语言程序设计》 课件 蔡玲芳 第七章 指针_第2页
《C语言程序设计》 课件 蔡玲芳 第七章 指针_第3页
《C语言程序设计》 课件 蔡玲芳 第七章 指针_第4页
《C语言程序设计》 课件 蔡玲芳 第七章 指针_第5页
已阅读5页,还剩42页未读 继续免费阅读

下载本文档

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

文档简介

指针与函数为指针变量赋初值取内容运算指针运算取地址运算的一般形式:&变量取地址运算若有变量说明:inta,b,*p,

*q;scanf(“%d”,

&a);p=&a;q=p;&a10int

*p;int

a;&aint

*q;p=&a;*p=10;printf(“%d”,*p);scanf(“%d”,&a);scanf(“%d”,p);b=*p+25;让p指向变量a把10赋给变量a输出p所指变量的值给变量a输入值给变量a输入值把35赋给变量b取内容运算取内容运算的一般形式:*指针表达式若*p出现在赋值号左边,表示给p所指变量赋值若*p不出现在赋值号左边,表示p所指变量的值若有变量说明:inta,b,*p

;

为指针变量赋初值指针变量使用前必须有值指针变量的初值必须是地址值(不能是整数)在定义指针变量时同时初始化int a,*p=

&a;使用赋值语句赋值inta,*p; p=&a;NULL是在stdio.h中定义的符号常数#defineNULL0可以为指针赋空值(NULL),此时指针不指向任何变量,如:p=NULL;

(p为空指针变量),不提倡p=0;

p=‘\0’。指针变量0012FF440012FF3C001整型变量i变量i_pointer0012FF40整型变量k…...10100012FF442FF38例 inti,k,*i_pointer;i=10;

i_pointer=&i;k=

i;k=

*i_pointer;--直接访问--间接访问变量的两种赋值方式#include

<stdio.h>intmain(

){

int a,b;int *pa, *pb;a=100; b=10;pa=&a; pb=&b;printf("%d,%d\n",a,b);printf("%d,%d\n",*pa,*pb);return

0;}[例8-1]

用直接方式和间接方式输出变量的值。给变量a,b初始化给指针变量pa,pb初始化对变量的直接访问对变量的间接访问[例8-2]将两个整型数a,b按由大到小次序输出。#include

<stdio.h>intmain(

){int

a,b,*p1=&a,*p2=&b,*p;scanf("%d%d",&a,&b);if

(a<b)if

(a<b){

p=p1;p1=p2;p2=p; }printf("%d,%d\n",a,b);printf("%d,%d\n",*p1,*p2);return

0;}5

95,

99,

55

99,

59,

5交换p1,p2的指向#include

<stdio.h>intmain(

){inta,b,*p1=&a,*p2=&b,

p;scanf("%d%d",&a,&b);交换p1,p2所指的单元的内容{

p=*p1;*p1=*p2;*p2=p; }printf("%d,%d\n",a,b);printf("%d,%d\n",*p1,*p2);return

0;}感谢观看指针数组指针数组:数组中的元素均为指针类型。适合用来指向字符串。1.定义形式数据类型

*

数组名[常量表达式]

例如:int*pa[6];[]比*优先级高,因此pa先与[6]结合,形成pa[6],具有6个元素。然后再与*结合,表示此数组中每一个元素是指针型的。8.5指针数组2整数整数整数整数整数整数pa[0]pa[1]pa[2]pa[3]pa[4]pa[5]指针数组pa2.功能定义一个由6个指针变量构成的指针数组,数组中的每个数组元素都是一个指向一个整数的指针变量。3.指针数组的初始化*pa[0]123a[0]*pa[1]456a[1]*pa[2]789a[2]必须用地址值为指针数组初始化inta[3][3]=

{1,2,3,4,5,6,7,8,9},*pa[3];pa[0]=a[0];pa[1]=a[1];pa[2]=a[2];指针数组pa[3]

相当于有三个指针,*pa[0],*pa[1],*pa[2]初始化的结果:注意:int*p[5];

int(*p)[5];

不同44.指针数组的使用用指针数组和用数组地址引用数组元素是等价的*(pa[i]+j)与*(a[i]+j);*(*(pa+i)+j)与*(*(a+i)+j);(*(pa+i)[j]与(*(a+i)[j];*(&pa[0][0]+3+i+j)与*(&a[0][0]+3+i+j);*(pa[0]+3+i+j)与*(a[0]+3+i+j)

;pa[i][j]与a[i][j]

;区别:pa[i]的值可变,而a[i]的值不可变。#include

<stdio.h>#defineN

4intmain()

{inta[N][N],i,j,sum=0,*p[N]

;for(i=0;i<N;i++)p[i]=a[i];for(i=0;i<N;i++)for(j=0;j<N;j++)scanf("%d",p[i]+j);5[例8-12]

求N阶方阵副对角线上的元素之和。for(i=0;i<N;i++)for(j=0;j<N;j++)if(i+j==N-1)sum+=p[i][j];printf("sum=%d\n",sum);return0;}1 2 3 45 6 7 89 10

11

1213 14

15

16sum=34感谢观看指针变量与数组指针变量与数组指针与一维数组指针的运算字符指针与字符串数组中的每个元素都可以通过下标唯一确定,即通过下标可以访问(操作)数组中的元素。在C语言中,凡是可以通过数组下标方式完成的访问(操作)均可以通过指针方式实现。C语言规定:数组名就是数组的首地址常量,即int

a[10];a==

&a[0]C语言系统内部处理机制,指针方式效率高,但不直观。指针与一维数组a[6]a[0]a[1]a[2]a[3]a[4]a[5]a[9]memory访问数组的两种方式下标方式inta[10],

*p;p=a;

(等价于

p=&a[0];)使p指向a数组的第一个元素a[0];a[i],*(a+i),

p[i]

,*(p+i)

等价

。指针方式通过指向数组元素的指针变量访问所需元素。int

a[10],*p=&a[0];p++;p=&a[0]p++p++指向数组元素的指针通过指针引用数组a[7]a[8]下标法

#include

<stdio.h>intmain(

){ inta[10],

i;for(i=0;i<10;i++)scanf("%d",

&a[i]);printf("\n");for(i=0;i<10;i++)printf("%3d",a[i]);return

0;}例:输出数组全部元素。指针法

#include

<stdio.h>intmain(

){int

a[10],

i, *p=a;for(i=0;i<10;i++,p++)scanf(“%d”,

p);printf(“\n”);for(p=a;p<(a+10);

p++)printf(“%3d”,*p

);return

0;}*(a+i)

指针的运算指针的算术运算指针表达式与整数的加减运算指针自增自减运算指针的关系运算同类指针相减强制类型转换运算指针表达式与整数的加减运算一般形式p+n或 p-n其中:p是任意一个指针表达式,n是任何一种整型表达式。计算规则表达式

p+n

的值

=

p的值

+

p所指类型长度*n表达式

p-n的值

=

p的值 -

p所指类型长度*n说明:只有当p和p+n或p-n都指向连续存放的同类型数据区域(数组)时,指针加、减才有实际意义。C语言规定:表达式p+n和p-n的类型与p相同。p,ap+1,a+1p+i,a+ia[0]a[1]a[i]a数组*(p+i)例如:int

a[10],*p,*q;p=a;q=a+6;a[6]p+9,a+9a[9]q=a+6数组和指针的本质不同:数组名是指针常量,不能改变指针常量的值,a++;a+=2;a=p;

都是非法的。指针p是变量,若p指向数组的首地址,p+1代表该类型的下一变量的地址。语法后缀:

p++

; p--

;前缀:

++p

; --p

;⑴

进行++p或p++运算后都使p指向下一个数据表达式p++的值等于p的原来值;表达式++p的值等于p的新值;⑵取内容运算符“

*

”、取地址运算符“

&

”和自增自减运算符都是单目运算符,运算的优先级相同,结合方向都是自右至左

指针自增自减运算......p-3p-2p-1pp+1p+2..................数组a低地址高地址当两个指针指向同一个数组中的元素时,才能进行>、<、>=、<=、!=、==的关系运算。任何指针p与NULL进行“p==NULL”或“p!=NULL”运算均有意义:判断指针p

是否指向空。指针的关系运算只有同类指针进行比较才有意义。指针的关系运算例:inta[10],

*p;p=&a[4];a[4]

假定指针p和q指向同一个数组,则:p>

q:p>=q:p指针所指元素位于q所指元素之后时为1,反之为0。p指针所指元

素位于q所指元素之后(或两指针指向同一元素)时为1,反之为0。p==q:两指针指向同一元素时为

1,反之为0。p!=q:两指针不指向同一元素时为

1,反之为0。语法:

指针表达式 关系运算符 指针表达式==和!=运算符,比较两个指针表达式是否指向同一个内存单元;<、<=、>、>=,比较两个指针所指内存区域的先后次序。.语法

:p-q说明:同类指针相减时,两个指针应该指向连续存放的同类数据区域。p-q

的值,等于(p的值-q的值)/所指类型长度,

即p,

q两个指针之间数据元素的个数。例如:若有

int

a[10]

,*p, *q;p=a;q=&a[5];则

p-q=5,表示p,

q之间数据元素的个数是5。同类指针相减格式:(类型名

*) 指针表达式功能:将指针表达式的值转换成指定类型的指针。例如:int

*p;double d,

*q=&d;p=(int*

)q;强制类型转换运算[例8-3]用指针访问数组元素。#include

<stdio.h>intmain(

){inta[10],*pa,

i;for(i=0;i<10;i++)a[i]=i+1;pa=a;for(i=0;i<10;i++,pa++)printf("%d

",*pa);printf("\n");return

0;}不要忘记赋初值字符指针与字符串字符串的表示形式用字符数组表示,如:intmain(

){ charstring[]=“Ilove

China!”;printf(“%s\n”,string);return

0;}数组名用字符指针实现,如:intmain(

){ char*string=“IloveChina!”;printf(“%s\n”,string);return

0;}把“I

love

China!”的首地址赋给指针变量string特点:字符串的长度不受限制;字符指针指向别处,字符串将失踪。此字符串不能改变,只能读取。[例8-5]使用字符指针输出字符串。#include

<stdio.h>intmain(

){ char*p="C

Language";for(;*p!=′\0′;)putchar(*++p);return

0;}字符指针变量与字符数组的区别字符数组由若干个元素组成,每个元素中放一个字符,而字符指针变量中存放的是字符串的首地址。赋值方式:

char

str[

]=“I

am

aboy!”或:

char

str[20];gets(str);字符指针变量指向字符串首地址。赋值方法三种:char*pa=“Iama

boy!”char

*pa;pa=“Iama

boy!”如果要修改字符串的内容,必须按如下方式处理:(3)charstr[20],

*pa=str;gets(str);

或scanf(“%s”,pa);或

scanf(“%s”,str);注意区别?感谢观看指向数组的指针变量a[0]a[1]a[2]类型说明符

(*变量名)[正整型常量表达式];定义一个名为“变量名”的指针变量,这个指针变量所指的对象是一个有“正整型常量表达式”个元素的一维数组

(建立一个与二维数组名一样的行指针)例如:inta[3][4],(*p)[4]=a;定义p是一个指针变量,它指向包含4个整型元素的一维数组。p,ap+1p+2指向数组的指针变量intmain(

){int

a[3][4]={{1,3,5,7},{9,11,13,15},{17,19,21,23}};int*p,i,j

;p=a[0];scanf(“d,

d”,&i,&j);printf(“a[d][d]=d\n”,i,j,*(p+i*4+j));return

0;}输入:1,2运行结果:a[1][2]=13这里的指针变量p是定义为指向整型数据的a[i][j]在数组中的位置用相对于数组起始位置intmain(

){ int

a[3][4]={{1,3,5,7},{9,11,13,15},{17,19,21,23}};int(*p)[4],i,j

;p=a;scanf(“d

d”,&i,&j);printf(“a[d][d]=d\n”,i,

j,*(*(p+i)+j));return

0;}输入:1,2运行结果:a[1][2]=13p,a第i行j列元素的地址为:*(p+i)+j第i行j列元素的值为:*(*(p+i)+j)这里的指针变量p不是指向整型p+1a[0]=1357变量,而是指向一个包含4个整p+2a[1]=9111315a[2]=17192123型元素的一维数组。感谢观看指针与字符串数组字符串数组数组中的每个元素都是存放字符的数组。字符串数组的每一行可存放一个字符串。用赋初值的方式给字符串数组赋值⑴直接给字符串数组赋初值⑵用指针数组处理多个字符串8.6指针与字符串数组VC\0FORTRAN\0BASIC\0Foxpro\0charb[4][8]={″VC″,″FORTRAN″,″BASIC″,

″Foxpro″};二维字符数组⑴直接给字符串数组赋初值

由于字符串长短不一,定义时应考虑最长的串和结束标志的位置。防止造成内存单元浪费。若有定义:char*f[4]={″VC″,″FORTRAN″,″BASIC″,

″Foxpro″};此定义还可以写成:char*f[]={″VC″,″FORTRAN″,″BASIC″,

″Foxpro″};则数组f中的每个元素都存放着对应的一个字符串的首地址,各字符串依次存入各相应的首地址开始的连续存储单元中。f[0]f[1]f[2]f[3]VC\0FORTRAN\0BASIC\0Foxpro\0节省内存空间!⑵用指针数组处理多个字符串[例8-13]

用指针数组输出多个字符串。#include

<stdio.h>intmain(

){char *s[4]={"dog","cat","pig","all

animals"};int

i;for(i=0;

i

<4; i++)printf("%s\n",

s[i]);return

0;}指针数组s各元素的值就是每个字符串的首地址。

温馨提示

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

评论

0/150

提交评论