C语言新教材PPT课堂课件-第10章指针.ppt

上传人:君**** 文档编号:77879672 上传时间:2023-03-16 格式:PPT 页数:62 大小:509KB
返回 下载 相关 举报
C语言新教材PPT课堂课件-第10章指针.ppt_第1页
第1页 / 共62页
C语言新教材PPT课堂课件-第10章指针.ppt_第2页
第2页 / 共62页
点击查看更多>>
资源描述

《C语言新教材PPT课堂课件-第10章指针.ppt》由会员分享,可在线阅读,更多相关《C语言新教材PPT课堂课件-第10章指针.ppt(62页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、第10章 指针 C程序的变量所存放的数据:数值型数据:整数、实数通过前面的学习,我们已知道:字符型数据:字符、字符串 结构型数据:数组、结构体、共用体 占有一定长度的内存 单元 如:int x;x占二字节、二个单元 每一个变量都有一个地址,为无符号整数,它不同于一般的整数。问题:问题:能否对地址运算?能否用一个变量保存地址?这些变量具有的性质:这些变量具有的性质:指针是语言中的重要概念,也是语言的重要特色。使用指针,可以使程序更加简洁、紧凑、高效。10.1 地址和指针的概念地址和指针的概念一、数据在内存中的存放一、数据在内存中的存放设:系统分配i的起始地址为2000的单元内存:为一个连续编号(

2、连续地址)且以一个单元为一个字节的连续存贮区。若程序中定义了三个int变量i,j,k int i=5,j=5,k=10;则:j的起始地址有可能为为2002的单元k的起始地址有可能为2004的单元2000200120022003200420053001 5+5102000ijk当程序中要用它们的值时:y=i+j+k;找到j的地址2002,将2002,20003中的数据5读出;找到k的地址2004,将2004,2005中的数据10读出。分别 找到i的地址2000,将2000,2001中的数据5读出;则系统通过一张变量名与地址对应关系表:上述过程称为变量的“直接访问”然后把这些数据进行算术运算。直接

3、访问:直接使用存放该数据的变量名。i相当于使用 5使用变量如如:用pi,pj,pk来存放i,j,k的地址200020022004 55103001300330053007200020022004pipjpkijk 若要得到变量i的值,可以先访问pi,得到i的地址,再通过该地址找到它i的值。显然,pi与i是通过i的地址联系起来的。间接访问:如果将某一变量的地址(如i的地址2000)存放到另一个变量x,则可通过x来存取i的值。(1)指针即地址 一个变量的地址称为该变量的指针。通过变量的指针能够找到该变量。(2)指针变量专门用于存储其它变量地址的变量 指针变量pi的值就是变量i的地址。指针与指针变量

4、的区别,就是变量值与变量的区别。(3)为表示指针变量和它指向的变量之间的关系,用指针运算符“*”表示。在定义变量时表示是指针,在引用变量时表示取值。例如:int num,*num_pointer;/*定义num_pointer为指向 int 型的指针变量*/num=5;/*将5直接赋给变量num*/num_pointer=#/*使num_pointer指向num*/*num_pointer=3;/*将3赋给指针变量num_pointer所指向的num*/此时变量num的值=3。被间接赋值为3,即指针变量num_pointer所指向的值为3。二、指针与指针变量二、指针与指针变量10.2.

5、1 定义一个指针变量定义一个指针变量表示该变量为指向某类型变量的指针变量。如:int p;(p为指向整型变量的指针)char*s;(s为指向字符型变量的指针)float*t;(t为指向浮点型变量的指针)定义指针变量的一般形式为:类型名 指针变量名10.2 变量的指针和指向变量的指针变量变量的指针和指向变量的指针变量例例10.1 指针变量的定义与相关运算示例。main()int num_int=12,*p_int;/*定义一个指向int型数据的指针变量p_int*/float num_f=3.14,*p_f;/*定义一个指向float型数据的指针变量p_f*/char num_ch=p,*p_c

6、h;/*定义一个指向char型数据的指针变量p_ch*/p_int=&num_int;/*取变量num_int的地址,赋值给p_int*/p_f=&num_f;/*取变量num_f的地址,赋值给p_f*/p_ch=&num_ch;/*取变量num_ch的地址,赋值给p_ch*/printf(“num_int=%d,*p_int=%dn”,num_int,*p_int);printf(“num_f=%4.2f,*p_f=%4.2fn”,num_f,*p_f);printf(“num_ch=%c,*p_ch=%cn”,num_ch,*p_ch);程序运行结果:num_int=12,*p_int=1

7、2num_f=3.14,*p_f=3.14num_ch=p,*p_ch=p10.2.2 指针变量的引用指针变量的引用请牢记:请牢记:指针变量中只能存放地址(指针),不要讲一个整型量(或任何其他非地址类型的数据)赋给一个指针变量。下面赋值是不合法的:int *pointer_1;pointer_1=100;有两个有关的运算符:(1)&:取地址运算符;(2)*:指针运算符(或称“间接访问”运算符)。例如:&a为变量a的地址,*p为指针变量p所指向的存储单元。例例10.2 输入2个整数,从大到小排序输出。main()int*p1,*p2,*p,a,b;scanf(“%d%d”,&a,&b);p1=&

8、a;p2=&b;if(ab)/*如果ab则不交换输出,否则,交换后输出。p1p2abp1p2ab对于“&”和“*”运算符做一些说明:(1)如果有pointer_1=&a,那么&*pointer_1是什么?由于*pointer_1是变量a的值,那么&*pointer_1就是变量a的地址。(2)如果有*&a,那么*&a是什么含义?先进行&a运算,得到a的地址,在进行*运算。即&a所指向的变量,等价于变量a。注意:存取指针变量所指向变量(目标变量)的值:用指针运算符*,即:*p 为 i。,&为同级运算符,结合性自右至左。则当&或&在一起时,具有抵消作用。(3)(*pointer_1)+相当于a+。注

9、意前面要有括号。10.2.3 指针变量作函数参数指针变量作函数参数1.指针变量,既可以作为函数的形参,也可以作函数的实参。2.指针变量作实参时,与普通变量一样,也是“值传递”,即将指针变量的值(一个地址)传递给被调用函数的形参(必须是一个指针变量)。注意注意:被调用函数不能改变实参指针变量的值,但可以改变实参指针变量所指向的变量的值。例例10.3 使用函数调用方式,输入2个整数,从大到小排序输出,要求实参为指针变量。void swap(int*p1,int*p2)int temp;temp=*p1,*p1=*p2,*p2=temp;main()int a,b;int*pointer_1=&a,

10、*pointer_2=&b;scanf(“%d%d”,&a,&b);if(ab)swap(pointer_1,pointer_12);/*指针变量作实参*/printf(“n%d,%dn”,a,b);/*输出排序后的a和b的值*/程序运行情况:5 9 9 5 虽然被调用函数不能改变实参指针变量的值,但可以通过它来改变它们所指向的变量的值。为了利用被调用函数改变的变量值,应该使用指针变量作函数实参。其机制为:在执行被调用函数时,使形参指针变量所指向的变量的值发生变化;函数调用结束后,通过不变的实参指针将变化的值保留下来。例例10.4 输入3个整数,按降序(从大到小的顺序)输出。要求使用变量的指针

11、作函数调用的实参来实现。swap(int*p1,int*p2)int temp;temp=*p1,*p1=*p2,*p2=temp;exchange(int*q1,int*q2,int*q3)if(*q1*q2)swap(q1,q2);if(*q1*q3)swap(q1,q3);if(*q2*q3)swap(q2,q3);main()int a,b,c,*p1,*p2,*p3;scanf(“%d%d%d”,&a,&b,&c);p1=&a,p2=&b,p3=&c;exchange(p1,p2,p3);printf(“排序结果:%d,%d,%dn”,a,b,c);程序运行情况:9 0 10 10,

12、9,0 一个变量的地址为该变量的指针。当用一个变量来存放该地址(指针)时,称为指针变量。一个数组元素相当于一个简单变量。于是,亦可用一个指针变量来指向数组元素。不同之处:数组元素连续地占用内存单元,则当一个元素的指针已知时,其它元素的指针亦可知道。10.3 数组与指针数组与指针 概述概述1.概念数组的地址数组在内存中的起始地址,数组元素的地址数组元素在内存中的起始地址。指向数组元素的指针即指针变量的值为数组元素的地址。2.指向数组元素的指针变量的定义指向数组元素的指针变量的定义,与指向普通变量的指针变量的定义方法一样。例如,int array10,*pointer=array;指向数组元素的起

13、始地址指向数组元素的第0号元素。或者:int array10,*pointer&array0;注意注意:数组名代表数组在内存中的起始地址(与第0个元素的地址相同),所以可以用数组名给指针变量赋值。3.数组元素的引用数组元素的引用,既可用下标法,也可用指针法。使用下标法,直观;而使用指针法,能使目标程序占用内存少、运行速度快。定义方法与简单变量指针定义相同,但引用略有不同例:int a10;int p;/*定义*/p=&a0;/*将a的第0个元素的地址赋给p*/C语言规定:数组a的首地址即用&a0表示,亦可用a表示 所以:p=&a0;和 p=a等价10.3.1 指向数组元素的指针指向数组元素的指

14、针 上面也可以这样定义:int a10,*p=&a0;或 int a10,*p=a;10.3.2 通过指针引用数组元素通过指针引用数组元素 C语言的规定:如果指针变量p已指向数组中的一个元素,则p+1指向同一数组中的下一个元素(而不是将p值简单加1)。如果p的初值为&a0,则:(1)p+i和a+i就是ai的地址,或者说,它们指向a数组的第i个元素。(2)*(p+i)或*(a+1)是p+i或a+i所指向的数组元素,即ai。如:*(p+5)或*(a+5)就是a5。(3)指向数组的指针变量也可以带下标,如pi与*(p+i)等价。例例 10.5 用上面提到的四种表达方式输出同一个数组。#include

15、 main()int a5=1,2,3,4,5;int i;int*pa;for(i=0;i5;i+)printf(“a%d=%d”,i,ai);/*数组下标法*/putchar(n);pa=a;for(i=0;i5;i+)printf(pa%d=%d,i,pai);/*指针下标法*/putchar(n);for(i=0;i5;i+)printf(*(a+%d)=%d,i,*(a+i);/*指针法1*/putchar(n);for(pa=a;paa+5;pa+)printf(*(pa+%d)=%d,i,*pa);/*指针法2*/putchar(n);运行结果:a0=1 a1=2 a2=3 a3

16、=4 a4=5pa0=1 pa1=2 pa2=3 pa3=4 pa4=5*(a+0)=1 *(a+1)=2 *(a+2)=3 *(a+3)=4 *(a+4)=5*(pa+0)=1 *(pa+1)=2 *(pa+2)=3 *(pa+3)=4 *(pa+4)=5说明:说明:(1)以上四种输出方法等价。(2)以上四种方法修改的是同一内存单元内的内容。在使用指针变量时,有几个问题要注意:在使用指针变量时,有几个问题要注意:(1)指针变量的值是可以改变的,所以必须注意其当前值,否则容易出错。如:p+是合法的,那么能不能a+呢?(2)指向数组的指针变量,可以指向数组以后的内存单元,虽然没有实际意义。(3)

17、对指向数组的指针变量(px和py)进行算术运算和关系运算的含义 1)可以进行的算术运算,只有以下几种:pxn,px+/+px,px-/-px,px-py pxn:将指针从当前位置向前(+n)或回退(-n)n个数据单位,而不是n个字节。显然,px+/+px和px-/-px是pxn的特例(n=1)。px-py:两指针之间的数据个数,而不是指针的地址之差。2)关系运算 表示两个指针所指地址之间、位置的前后关系:前者为小,后者为大。例如,如果指针px所指地址在指针py所指地址之前,则pxpy的值为1。10.3.3 数组名作函数参数数组名作函数参数数组名作形参时,接收实参数组的起始地址;作实参时,将数组

18、的起始地址传递给形参数组。引入指向数组的指针变量后,数组及指向数组的指针变量作函数参数时,可有种等价形式(本质上是一种,即指针数据作函数参数):(1)形参、实参都用数组名。例例10.6:void inv(int x,int n)int temp,i,j,m=(n-1)/2;for(i=0;i=m;i+)j=n-1-i;temp=xi;xi=xj;xj=temp;main()int i,a10=3,7,9,11,0,6,7,5,4,2;printf(“nthe original array is:n”);for(i=0;i10;i+)printf(“%d ”,ai);inv(a,10);prin

19、tf(“nthe array has been inverted:n”);for(i=0;i10;i+)printf(“%d ”,ai);(2)形参、实参都用指针变量例例10.7 void inv(int*x,int n)int*p=x+m,temp,*i=x,*j=x+n-1,m=(n-1)/2;for(;i=p;i+,j-)temp=*i;*i=*j;*j=temp;main()main()intint i,a10=3,7,9,11,0,6,7,5,4,2,*p=a;i,a10=3,7,9,11,0,6,7,5,4,2,*p=a;printf(ntheprintf(nthe origina

20、l array is:n);original array is:n);for(i=0;i10;i+)for(i=0;i10;i+)printf(%dprintf(%d ,ai);,ai);inv(inv(p p,10);,10);printf(ntheprintf(nthe array has been inverted:n);array has been inverted:n);for(i=0;i10;i+)for(i=0;i10;i+)printf(%dprintf(%d ,ai);,ai);(3)形参用指针变量、实参用数组名 例例10.8 void inv(int*x,int n)int

21、*p=x+m,temp,*i=x,*j=x+n-1,m=(n-1)/2;for(;i=p;i+,j-)temp=*i;*i=*j;*j=temp;main()int i,a10=3,7,9,11,0,6,7,5,4,2;printf(“nthe original array is:n”);for(i=0;i10;i+)printf(“%d ”,ai);inv(a,10);printf(“nthe array has been inverted:n”);for(i=0;i10;i+)printf(“%d ”,ai);(4)形参用数组名、实参用指针变量 例例10.9 void void inv(i

22、ntinv(int x x,intint n)n)intint temp,i,j,m=(n-1)/2;temp,i,j,m=(n-1)/2;for(i=0;i=m;i+)for(i=0;i=m;i+)j=n-1-i;temp=xi;xi=xj;xj=temp;j=n-1-i;temp=xi;xi=xj;xj=temp;main()intmain()int i,a10=3,7,9,11,0,6,7,5,4,2,*p=a;i,a10=3,7,9,11,0,6,7,5,4,2,*p=a;printf(ntheprintf(nthe original array is:n);original arra

23、y is:n);for(i=0;i10;i+)for(i=0;i10;i+)printf(%dprintf(%d ,ai);,ai);inv(inv(p p,10);,10);printf(ntheprintf(nthe array has been inverted:n);array has been inverted:n);for(i=0;i10;i+)for(i=0;i10;i+)printf(%dprintf(%d ,ai);,ai);10.3.4 二维数组的指针及其指针变量二维数组的指针及其指针变量 1.二维数组的指针 假设有如下数组定义语句:int array34;(1)从2维数组

24、角度看,数组名array代表数组的起始地址,是一个以行为单位进行控制的行指针:array+i:行指针值,指向2维数组的第i行。*(array+i):(列)指针值,指向第i行第列(控制由行转为列,但仍为指针)。*(*(array+i):数组元素arrayi0的值。用array作指针访问数组元素arrayij的格式:*(*(array+i)j)array0:array00array01array02array03array10array11array12array13array20array21array22array23注意注意:行指针是一个级指针。(2)从1维数组角度看,数组名array和第1

25、维下标的每一个值,共同构成一组新的1维数组名array0、array1、array2,它们均由4个元素组成。语言规定:数数组组名名代代表表数数组组的的地地址址,所以arrayi是第i行1维数组的地址,它指向该行的第0列元素,是一个以数组元素为单位进行控制的列指针:arrayi+j:(列)指针值,指向数组元素arrayij。*(arrayi+j):数组元素arrayij的值。如果有“int array34,*p=array0;”,则p+1指向下一个元素,如图9-8所示。用p作指针访问数组元素arrayij的格式:*(p+(*每行列数每行列数+j)2.行指针变量指向由n个元素组成的一维数组的指针变

26、量(1)定义格式 数据类型数据类型 (*指针变量指针变量)n;注注意意:“*指针变量”外的括号不能缺,否则成了指针数组数组的每个元素都是一个指针指针数组(本章第6节介绍)。(2)赋值行指针变量行指针变量 2维数组名维数组名|行指针变量行指针变量;例例10.7 使用行指针和列指针两种方式输出2维数组的任一元素。(1)使用行指针 例例10.10 main()int array34=1,2,3,4,5,6,7,8,9,10,11,12;int(*pointer)4,row,col;pointer=array;printf(“Input row=”);scanf(“%d”,&row);printf(“

27、Input col=”);scanf(“%d”,&col);printf(“array%1d%1d=%dn”,row,col,*(*(pointer+row)+col);程序运行情况:Input row=1 Input col=2 array12=7例例10.11 输出二维数组元素。#include main()int a34=1,2,3,4,5,6,7,8,9,10,11,12;int*p,i,j;p=a0;for(i=0;i3;i+)for(j=0;j4;j+)printf(%d,*(*(a+i)+j);/*指针表示法*/putchar(n);for(i=0;i3;i+)for(j=0;j

28、4;j+)printf(“%d”,*(ai+j);/*行数组表示法*/putchar(n);for(i=0;i3;i+)for(j=0;j4;j+)printf(%d,(*(a+i)j);/*列数组表示法*/putchar(n);for(i=0;i3;i+)for(j=0;j4;j+)printf(“%d”,*p+);/*指针直接表示法1*/putchar(n);for(i=0,p=a0;i3*4;i+)printf(%d,*p+);/*指针直接表示法2*/putchar(n);运行结果:1 2 3 4 5 6 7 8 9 10 11 12(一共有五行)设有三个学生,各有四门功课,求总的平均分

29、,各学生总分,且将三个学生的成绩按总分排序。要求用指针变量:综合实例综合实例:实参可用指向数组的指针变量(实数组名)实参可用指向一维数组的指针变量;即:数组名2维数组的指针作函数实参时,有列指针和行指针两种形式。相应的,用来接受实参数组指针的形参,必须使用相应形式的指针变量,如下所示:实参:列指针 行指针 形参:(列)指针变量 行指针变量3 用指向数组的指针作函数参数用指向数组的指针作函数参数输入三学生单科成绩一、流程图:一、流程图:计算各学生总分计算总平均分按各学生总分排序打印各科成绩总分及总平均分结束调用函数sumscore(p,n)指针,指向一维数组调用函数average(p,n)调用函

30、数sort(p,n)调用函数printscore(p,n)学生人数指向二维数组 人数返回值float指向一维数组人数指向二维数组人数main()void sumscore();float average();void sort();void printscore();static float score35=65,80,90,100,80,66,75,90,58,60,90,83;sumscore(score,3);printf(n average=%f,average(score,3);sort(score,3);printscore(score,3);二、程序二、程序1)主函数主函数 vo

31、id sumscore(p,n)float p;int n;float aver,p_end;p_end=p+5n 1;for(;p=p_end;p=p+5)(p+4)=p+p(p+1)+(p+2)+(p+3);2)sumscore函数函数求总分求总分 float average(p,n)float(p)5;int n;float aver=0.0;int i;for(i=0;in;i+)aver=aver+(p+i)+4);aver=aver/n return(aver);3)average函数函数求总平均求总平均分分有二种方法:(1)循环时用简单变量 (2)循环时用指针变量方法(1)voi

32、d sort(p,n)float p;int n;int i,j,k,m;float t;三.sort函数排序 for(i=0;in 1;i+)k=i;for(j=i+1;jn;j+)if(p+4+5 i)(p+4+5 j)k=j;if(k!=i)for(m=0;m5;m+)t=(p+m+5 i);(p+m+5 i)=(p+m+5 k);(p+m+5 k)=t;方法(2)void sort(p,n)float pint n;float p1,p_end,k,t;int m;p_end=p+5 n 1;p=p+4;for(;pp_end 5;p+=5)k=p;for(p1=p+5;p1p_end

33、;p1+=5)if(p p1)k=p1;if(k!=p)for(m=0;m5;m+)t=(p m);(p m)=(k1 m);(k1 m)=t;void printscore(p,n)float(p)5;int n;int i,j;printf(n A B C D sumn);for(i=0;i0;i+)printf(n);for(j=0;jb)return a;else return b;main()int(*pmax)(),x,y,z;pmax=max;printf(input two numbers:n);scanf(%d%d,&x,&y);z=(*pmax)(x,y);printf(m

34、axmum=%d,z);从上述程序可以看出用,函数指针变量形式调用函数的步骤如下:1.先定义函数指针变量,如后一程序中第9行 int(*pmax)();定义 pmax为函数指针变量。2.把被调函数的入口地址(函数名)赋予该函数指针变量,如程序中 第11行 pmax=max;3.用函数指针变量形式调用函数,如程序第14行 z=(*pmax)(x,y);调用函数的一般形式为:(*指针变量名)(实参表)10.6 返回指针值的函数返回指针值的函数 一个函数可以返回一个int型、float型、char型的数据,也可以返回一个指针类型的数据。返回指针值的函数(简称指针函数)的定义格式如下:函数类型函数类型

35、 *函数名函数名(形参表形参表)例例10.17 某数理化三项竞赛训练组有3个人,找出其中至少有一项成绩不合格者。要求使用指针函数实现。int *seek(int(*pnt_row)3)int i=0,*pnt_col;/*定义一个(列)指针变量pnt_col*/pnt_col=*(pnt_row+1);/*使pnt_col指向下一行之首(作标志用)*/for(;i3;i+)if(*(*pnt_row+i)60)/*某项成绩不合格*/pnt_col=*pnt_row;/*使pnt_col指向本行之首*/break;/*退出循环*/return(pnt_col);/*主函数main()*/main

36、()int grade33=55,65,75,65,75,85,75,80,90;int i,j,*pointer;/*定义一个(列)指针变量pointer*/for(i=0;i3;i+)/*控制每个学生*/pointer=seek(grade+i);/*用行指针作实参,调用seek()函数*/if(pointer=*(grade+i)/*该学生至少有一项成绩不合格*/*输出该学生的序号和各项成绩*/printf(“No.%d grade list:”,i+1);for(j=0;j3;j+)printf(“%d ”,*(pointer+j);printf(“n”);程序运行结果:No.1 gr

37、ade list:55 65 75 程序说明:程序说明:(1)主函数中的pointer=seek(grade+i);语句调用seek()函数时,将实参grade+i(行指针)的值,复制到形参pnt_row(行指针变量)中,使形参pnt_row指向grade数组的第i行。(2)在指针函数seek()中:1)pnt_col=*(pnt_row+1);语句*(pnt_row+1)将行指针转换为列指针,指向grade数组的第i+1行第列,并赋值给(列)指针变量pnt_col。2)if(*(*pnt_row+i)60)行pnt_row是一个行指针,指向数组grade的第i行;*pnt_row使指针由行转

38、换为列,指向数组grade的第i行列;*pnt_row+j的值还是一个指针,指向数组的第i行第j列;*(*pnt_rowj)是一个数据(数组元素gradeij的值)。10.7 指针数组、主函数指针数组、主函数main()的形参和指向指针的指针的形参和指向指针的指针10.7.1 指针数组指针数组 1.概念 数组的每个元素都是一个指针数据。指针数组比较适合用于指向多个字符串,使字符串处理更加方便、灵活。2.定义格式 数据类型数据类型 *数组名数组名元素个数元素个数 注意注意:与行指针变量定义格式“(*行指针变量)”的差别。例例10.18 有若干计算机图书,请按字母顺序,从小到大输出书名。解题要求:

39、使用排序函数完成排序,在主函数中进行输入输出。void sort(char*name,int count)char*temp_p;int i,j,min;/*使用选择法排序*/for(i=0;icount-1;i+)/*外循环:控制选择次数*/min=i;/*预置本次最小串的位置*/for(j=i+1;j0)/*存在更小的串*/min=j;/*保存之*/if(min!=i)/*存在更小的串,交换位置*/temp_p=namei,namei=namemin,namemin=temp_p;/*主函数main()*/main()char*name5=“BASIC”,”FORTRAN”,”PASCAL

40、”,”C”,”FoxBASE”;int i=0;sort(name,5);/*使用字符指针数组名作实参,调用排序函数sort()*/for(;i5;i+)printf(“%sn”,namei);/*输出排序结果*/程序运行结果:BASICCFORTRANFoxBASEPASCAL程序说明:程序说明:(1)实参对形参的值传递:sort(name ,5);void sort(char*name,int count)(2)字符串的比较只能使用strcmp()函数。形参字符指针数组name的每个元素,都是一个指向字符串的指针,所以有strcmp(namemin,namej)。10.7.2 指向指针的指

41、针变量指向指针的指针变量 如果如果一个指针变量存放的又是另一个指针变量的地址,一个指针变量存放的又是另一个指针变量的地址,则称这则称这个指针变量为指向指针的指针变量个指针变量为指向指针的指针变量。在前面已经介绍过,通过指针访问变量称为间接访问,在前面已经介绍过,通过指针访问变量称为间接访问,简称间简称间访。由于指针变量直接指向变量,所以称为单级间访。访。由于指针变量直接指向变量,所以称为单级间访。而如果通过而如果通过指向指针的指针变量来访问变量则构成了二级或多级间访。指向指针的指针变量来访问变量则构成了二级或多级间访。在语言程序中,对间访的级数并未明确限制,在语言程序中,对间访的级数并未明确限

42、制,但是间访级数但是间访级数太多时不容易理解解,也容易出错,因此,一般很少超过二级间访。太多时不容易理解解,也容易出错,因此,一般很少超过二级间访。指向指针的指针变量说明的一般形式为:指向指针的指针变量说明的一般形式为:类型说明符类型说明符*指针变量名;指针变量名;例例如如:int*pp;表表示示pp是是一一个个指指针针变变量量,它它指指向向另另一一个个指指针针变变量量,而这个指针而这个指针变量指向一个整型量。下面举一个例子来说明这种关系。变量指向一个整型量。下面举一个例子来说明这种关系。例例10.19 main()int x,*p,*pp;x=10;p=&x;pp=&p;printf(x=%

43、dn,*pp);上例程序中上例程序中p 是一个指针变量,指向整型量是一个指针变量,指向整型量x;pp也是一个指针也是一个指针变量,变量,它指向指针变量它指向指针变量p。通过通过pp变量访问变量访问x的写法是的写法是*pp。程序最程序最后输出后输出x的值为的值为10。通过上例,可以学习指向指针的指针变量的。通过上例,可以学习指向指针的指针变量的说明和使用方法。说明和使用方法。下述程序中首先定义说明了指针数组下述程序中首先定义说明了指针数组ps并作了初始化赋值。并作了初始化赋值。又又说明了说明了pps是一个指向指针的指针变量。在是一个指向指针的指针变量。在5次循环中,次循环中,pps 分别取分别取

44、得得了了ps0,ps1,ps2,ps3,ps4的的地地址址值值,再再通通过过这这些些地地址址即即可找到该字符串。可找到该字符串。例例10.20 main()static char*ps=BASIC,DBASE,C,FORTRAN,PASCAL;char*pps;int i;for(i=0;i5;i+)pps=ps+i;printf(%sn,*pps);本程序是用指向指针的指针变量编程,输出多个字符串。本程序是用指向指针的指针变量编程,输出多个字符串。10.7.3 主函数主函数main()的形参的形参在以往的程序中,主函数main()都使用其无参形式。实际上,主函数main()也是可以指定形参的

45、。1.主函数main()的有参形式 main(int argc,char*argv)2.实参的来源运行带形参的主函数,必须在操作系统状态下,输入主函数所在的可执行文件名,以及所需的实参,然后回车即可。命令行的一般格式为:可执行文件名可执行文件名实参实参 实参实参23.形参说明(1)形参argc是命令行中参数的个数(可执行文件名本身也算一个)。在本例中,形参argc的值为空格分隔的参数个数加1。(2)形参argv是一个字符指针数组,即形参argv首先是一个数组(元素个数为形参argc的值),其元素值都是指向实参字符串的指针。元素argv0指向第1个实参字符串“执行文件名”,元素argv1 指向第

46、2个实参字符串,素argv2指向第3个实参字符串,.。例例10.21 打印执行文件名及命令行参数。其用法为:#include void main(int argc,char*argv)int i;for(i=0;ic1013.exe kkk ppp qqq输出:c1013.exe kkk ppp qqq本章小结1.指针是语言中一个重要的组成部分,使用指针编程有以下优点:(1)提高程序的编译效率和执行速度。(2)通过指针可共享变量或数据结构,便于实现双向数据通讯。(3)可以实现动态的存储分配。(4)便于编写高质量的程序。2.指针的运算(1)取地址运算符&:求变量的地址(2)取内容运算符*:表示指

47、针所指的变量(3)赋值运算 把变量地址赋予指针变量 同类型指针变量相互赋值 把数组,字符串的首地址赋予指针变量 把函数入口地址赋予指针变量(4)加减运算对指向数组,字符串的指针变量可以进行加减运算,如p+n,p-n,p+,p-等。对指向同一数组的两个指针变量可以相减。对指向其它类型的指针变量作加减运算是无意义的。(5)关系运算指向同一数组的两个指针变量之间可以进行大于、小于、等于比较运算。指针可与0比较,p=0表示p为空指针。3.与指针有关的各种说明和意义见下表。int*p;p为指向整型量的指针变量int*pn;p为指针数组,由n个指向整型量的指针元素组成。int(*p)n;p为指向整型二维数组的指针变量,二维数组的列数为nint*p()p为返回指针值的函数,该指针指向整型量int(*p)()p为指向函数的指针,该函数返回整型量int*p p为一个指向另一指针的指针变量,该指针指向一个整型量。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 高考资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁