C语言程序设计(第四版)(微课版)ch08 指针_第1页
C语言程序设计(第四版)(微课版)ch08 指针_第2页
C语言程序设计(第四版)(微课版)ch08 指针_第3页
C语言程序设计(第四版)(微课版)ch08 指针_第4页
C语言程序设计(第四版)(微课版)ch08 指针_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

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

文档简介

8.1指针概述8.2

访问变量的地址8.3

指针变量的定义与运算8.4指针与一维数组8.5指向指针的指针与指针数组8.6指针与二维数组8.7指针与字符串8.8指针兼容性8.9指针与函数8.10main函数的参数><8.1指针概述程序中:inti;

floatk;

内存中每个字节有一个编号-----地址…...…...2000200120022005内存02003ik函数调用时为其分配内存单元变量是对程序中数据存储空间的抽象><指针与指针变量指针:一个变量的地址指针变量:专门存放变量地址的变量叫~指针指针变量

变量的内容

变量的地址…...…...2000200420062005整型变量i10变量pointer2001200220032000指针变量变量变量地址(指针)变量值指向地址存入指针变量><8.2访问变量的地址&与*运算符含义含义:取变量的地址单目运算符结合性:自右向左含义:

取指针所指向变量的内容单目运算符结合性:自右向左两者关系:互为逆运算理解…...…...2000200420062005整型变量i10变量pointer2001200220032000指针变量pointer等价&i*pointer等价i&i等价&(*pointer)*pointer等价*(&i)200010pointeri*pointer><8.3

指针变量的定义与运算8.3.1指针变量的定义一般形式:[存储类型]

数据类型*指针名;合法标识符指针变量本身的存储类型指针的目标变量的数据类型表示定义指针变量不是‘*’运算符例int*p1,*p2;float*q;staticchar*name;注意:1、int*p1,*p2;与int*p1,p2;2、指针变量名是p1,p2,不是*p1,*p23、指针变量只能指向定义时所规定类型的变量4、指针变量定义后,变量值不确定,应用前必须先赋值><例inti;int*p=&i;变量必须已说明过类型应一致例

int*p=&i;

inti;例inti;int*p=&i;int*q=p;用已初始化指针变量作初值8.3.2指针变量的初始化一般形式:[存储类型]

数据类型*指针名=初始地址值;><【例8.2】通过指针变量的引用输出变量的值。#include<stdio.h>intmain(void){ inta,b; int*pa,*pb; a=66; b=88;

pa=&a; /*把变量a的地址赋给指针变量pa*/ pb=&b; /*把变量b的地址赋给指针变量pb*/ printf(“%d,%d\n”,a,b); printf(“%d,%d\n”,*pa,*pb); return0;}><利用指针实现两个变量值的互换#include<stdio.h>intmain(void){ inta=10,b=20,*pa,*pb,temp;

pa=&a; pb=&b; temp=*pa; *pa=*pb; *pb=temp; printf("a=%d,b=%d",a,b); return0;}pa&a1020apbb&b2010

运行结果:a=20,b=10><8.4指针与一维数组数组名是表示数组首地址的地址常量array[0]array[1]array[2]array[3]array[9]...整型指针p&array[0]p例intarray[10];int*p;

p=&array[0];//或p=array;或int*p=&array[0];或int*p=array;指针p的基类型与数组元素类型一致><a[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7]a[8]a[9]a数组pp+1,a+1p+i,a+ip+9,a+9a[0]a[1]a[2]a[3]a[9]...pp+9p+1p+2地址元素指针法*p*(p+1)*(p+2)*(p+9)下标法指针的算术运算:p++,p--,p+i,p-i,p+=i,p-=i若p1与p2指向同一数组,p1-p2=两指针间元素个数><8.5指向指针的指针与指针数组8.5.1指向指针的指针一级指针:指针变量中存放目标变量的地址p1&p2&i3P2(指针变量)i(整型变量)例int**p1;int*p2;inti=3;p2=&i;p1=&p2;**p1=5;二级指针:指针变量中存放一级指针变量的地址例int*p;inti=3;p=&i;*p=5;&i3P(指针变量)i(整型变量)一级指针单级间接寻址二级指针一级指针目标变量二级间接寻址><8.5.2指针数组1.指针数组的定义指针数组是指一个数组的各个元素均为指针类型数据,即指针数组中的每一个元素都相当于一个指针变量。一维指针数组的定义形式如下:类型名

*数组名[数组长度]例如:int*num[4];相当定义了4个指针变量,分别是num[0],num[1],num[2],num[3],它们存贮四个整型变量的地址。2.指针数组元素存贮普通变量的地址inta=10,b=20,c=30;int*n[3]={&a,&b,&c};相当于:n[0]=&a;n[1]=&b;n[2]=&c;><3.指针数组元素存贮一维数组的首地址inta[3]={1,2,3};intb[3]={4,5,6};int*p[2];C规定数组名就是数组第一个元素的指针,所以可进行如下赋值:p[0]=a;p[1]=b;><8.6指针与二维数组二维数组名作为指针而言,其基类型是一维数组。思考:a[i]+j是何含义?a[0][3]a[0][2]a[0][1]a[0][0]a[1][3]a[1][2]a[1][1]a[1][0]a[2][3]a[2][2]a[2][1]a[2][0]a[0]a[1]a[2]a+0a+1a+2a[0]+0a[0]+1a[0]+2a[0]+3a[1]+0a[1]+1a[1]+2a[1]+3a[2]+0a[2]+1a[2]+2a[2]+3a+i表示指向二维数组第i行的指针称之为“行指针”a[i]+j表示指向第i行第j列元素的指针称之为“列指针”

访问数组元素a[i][j]*(a[i]+j)*(*(a+i)+j)><(1)指向二维数组元素的指针变量main(){staticinta[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};

int*p;for(p=a[0];p<a[0]+12;p++){if((p-a[0])%4==0)printf("\n"); printf("%4d",*p);}}p=*(a+0);p=&a[0][0];p=*a;p=a;指针p的基类型与二维数组元素的类型一致。

inta[3][4];a[0][0]a[0][1]a[1][0]a[1][1]a[2][0]a[2][1]a[0][2]a[0][3]a[1][2]a[1][3]a[2][2]a[2][3]pp+1p+2...><(2)指向一维数组的指针变量(用行地址赋值)格式:类型名(*指针变量名)[一维数组长度];例如:int(*p)[4],

a[3][4];

含义:p是指针变量,它指向含有4个元素的一维数组,每个元素的类型是int。一维数组指针变量维数和二维数组列数必须相同。

p的值是一维数组的首地址,p是行指针int(*p)[4];p=a;pp+1p+2><int(*p)[4];inta[3][4];p=a;a[0][0]a[0][1]a[0][2]a[0][3]a[1][0]a[1][1]a[1][2]a[1][3]a[2][0]a[2][1]a[2][2]a[2][3]ap如果执行p+1,则变为如图所示p+1p第一行各元素可以表示为:如上通过(*(p+i))[j]或者*(*(p+i)+j)可以访问第i行第j个的元素><【例8.9】编程,按行输出一个3*4的二维数组中存放的12个数值。源程序:#include<stdio.h>intmain(){ intnum[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};

int(*p)[4];/*注意括号不能省略,4与上面列的数值4相同*/ inti,j;

p=num;/*注意p=num*/ for(i=0;i<3;i++) { for(j=0;j<4;j++)

printf("%4d",*(*(p+i)+j)); printf("\n"); } return0;}p的基类型是一维数组><8.7指针与字符串字符数组名表示字符串首地址例main(){

charstring[]=“IloveChina!”;printf(“%s\n”,string);printf(“%s\n”,string+7);}IloveChistring[0]string[1]string[2]string[3]string[4]string[5]string[6]string[7]string[8]string[9]stringstring[10]string[11]string[12]string[13]n!a\0><例main(){char*string=“IloveChina!”;printf(“%s\n”,string);

string+=7;while(*string){putchar(string[0]);string++;}}IloveChistringn!a\0字符指针初始化:把字符串首地址赋给stringchar*string;string=“IloveChina!”;string+7*string!=0><8.8指针兼容性8.8.1指针大小兼容charc;char*pc;inta;int*pa;pc=&c; /*合法*/pa=&a; /*合法*/pc=&a; /*不合法*/pa=&c; /*不合法*/><8.8.2void指针C99允许使用基类型为void的指针类型。可以定义一个基类型为void的指针变量。如void*p;。指向void的指针是一种不与某种基类型相关联的通用类型;也即,它并不是一个字符、整数、实数或其他任何类型的地址。8.8.3指针转换总结一下,指针类型转换的方法有两种:(1)强制转换,一般形式为:指针变量1=(指针变量1的基类型*)指针变量2(2)利用void指针,一般形式为:void指针=指针变量2指针变量1=void指针><8.9指针与函数8.9.1指针作为实际参数#include<stdio.h>voidfun(int*p);intmain(){

inta=10; printf(“调用前:\n”); printf(“a=%d\n”,a); printf(“变量a的地址:\t%#x\n”,&a); printf(“调用后:\n”);

fun(&a); printf(“a=%d\n”,a); return0;}voidfun(int*p){ printf(“指针p的值:\t%#x\n”,p);

*p=20;}><8.9.2指针型函数在C语言中允许一个函数的返回值是一个指针(即地址),这种返回指针值的函数称为指针型函数。定义指针型函数的一般形式为:类型说明符*函数名(形参表){ ……/*函数体*/}其中函数名之前加了类型说明符表示了返回的指针值所指向的数据类型。如:int*fun(intx,inty)“*”号表明这是一个指针型函数,即返回值是一个指针。><例8.19程序片段char*day_name(intn){ staticchar*name[]={"Illegalday!", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"}; return((n<1||n>7)?name[0]:name[n]);/*返回的是指针*/}为什么定义为staticname[0]~name[7]代表什么含义?><8.9.3函数指针变量

可以用指针变量指向整型变量、字符串、数组,也可以指向一个函数。函数指针:函数在编译时被分配的入口地址,用函数名表示max…...指令1指令2函数指针变量赋值:如p=max;函数返回值的数据类型专门存放函数入口地址可指向返回值类型相同的不同函数指向函数的指针变量定义形式:数据类型(*指针变量名)();

如int(*p)();函数调用形式:c=max(a,b);c=(*p)(a,b);对函数指针变量pn,p++,p--无意义()不能省int(*p)()与int*p()不同><例用函数指针变量调用函数,比较两个数大小main(){intmax(int,int);inta,b,c;scanf("%d,%d",&a,&b);c=max(a,b);printf("%d,%d,%d\n",a,b,c);}intmax(intx,inty){intz;if(x>y)z=x;elsez=y;return(z);}main(){intmax(int,int),(*p)();inta,b,c;p=max;scanf("%d,%d",&a,&b);

c=(*p)(a,b);printf("%d,%d,%d\n",a,b,c);}intmax(intx,inty){intz;if(x>y

温馨提示

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

评论

0/150

提交评论