C语言程序设计教程ppt课件_第1页
C语言程序设计教程ppt课件_第2页
C语言程序设计教程ppt课件_第3页
C语言程序设计教程ppt课件_第4页
C语言程序设计教程ppt课件_第5页
已阅读5页,还剩68页未读 继续免费阅读

下载本文档

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

文档简介

1、第8章 指针第8章 指针2. 变量的三要素:名字、类型与值 每个变量都经过变量名与相应的存储单元相连系,详细分配哪些单元给变量,由编译系统完成变量名到对应内存单元地址的变换。 变量分配存储空间的大小由类型决议。 变量的值那么是指相应存储单元的内容。 3.内存存取方式 直接存取:把直接按变量名或地址存取变量值的方式称为 “直接存取方式。 间接存取:经过定义一种特殊的变量专门存放内存或变量的地址,然后根据该地址值再去访问相应的存储单元 。第8章 指针系统为特殊变量p用来存放地址的分配的存储空间地址是4800,p中保管的是变量a的地址,即4000,当要读取a变量的值12345时,不是直接经过a变量,

2、也不是直接经过保管12345的内存单元的地址4000去取值,而是先经过变量p得到p的值4000,即a的地址,再根据地址4000读取它所指向单元的值12345。 这种间接的经过变量p得到变量a的地址,再存取变量a的值的方式即为“间接存取。 通常称变量p指向变量a,变量a是变量p所指向的对象400012345400040024800pap(4800) p(4800) a(4000) 4000123454000间接存取表示图第8章 指针4.指针的概念 在言语中,用指针来表示一个变量指向另一个变量这样的指向关系。 所谓指针即地址。 一个变量的指针即该变量的地址,如4000就是指向变量a的指针。 指针变

3、量:专门存放地址的变量,如p即是一个指针变量,它存放的是a的地址4000。第8章 指针8.1.2 指针变量的定义与初始化指针变量的定义与初始化1. 指针变量的定义指针变量的定义 类型标识符类型标识符 *指针变量名;指针变量名;例:例:float *p1; (定义定义p1为指向实型变量的指针变量为指向实型变量的指针变量) char *p2; (定义定义p2为指向字符型变量的指针变量为指向字符型变量的指针变量)在指针变量定义中,在指针变量定义中,*是一个阐明符,它阐明其后的变是一个阐明符,它阐明其后的变量是指针变量,如量是指针变量,如p是指针变量是指针变量,而不要以为而不要以为“*p是是指针变量。

4、指针变量。指针变量定义时指定的数据类型不是指针变量本身指针变量定义时指定的数据类型不是指针变量本身变量存放的值的数据类型,而是指针变量所指变量存放的值的数据类型,而是指针变量所指向的对象或称目的的数据类型向的对象或称目的的数据类型 指针变量存放的是所指向的某个变量的地址值,而普指针变量存放的是所指向的某个变量的地址值,而普通变量保管的是该变量本身的值通变量保管的是该变量本身的值 指针变量并不固定指向一个变量,可指向同类型的不指针变量并不固定指向一个变量,可指向同类型的不同变量同变量第8章 指针(1) 指针运算符与地址运算符指针运算符与地址运算符 与指针援用有关的两个运算符:与指针援用有关的两个

5、运算符:&与与*。 &:取地址运算符取地址运算符 *:指针运算符,或称指向运算符、间接访问运算:指针运算符,或称指向运算符、间接访问运算 符。符。指针指向的对象的表示方式指针指向的对象的表示方式: *指针变量指针变量此处此处*是访问指针所指对象的运算符是访问指针所指对象的运算符,与指针定义时的与指针定义时的*不同。不同。2. 指针变量初始化 第8章 指针(2) 指针变量初始化假设有定义: int a,*p;语句仅仅定义了指针变量p,但指针变量并未指向确定的变量(或内存单元)。由于这些指针变量还没有赋给确定的地址值,只需将某一详细变量的地址赋给指针变量之后,指针变量才指向确定的变

6、量内存单元。指针变量初始化:在定义指针时同时给指针一个初始值如: int a,*pa=&a;40003a(4000)pa*pa第8章 指针(3) 指针变量的援用 *指针变量名代表所指变量的值。 指针变量名代表所指变量的地址。有定义: int a,*p=&a;用*p来表示p指向的对象a,*p与a是等价的。 *p可以象普通变量一样运用。 例如: a=12; *p=12; scanf(%d,&*p); scanf(%d,p); printf(“%d%d,*p,a);留意:*与&具有一样的优先级,结合方向从右到左。这样,&*p即&(*p),是对变量*p取

7、地址,它与&a等价;p与&(*p)等价,a与*(&a)等价。 由于p本身就是指针,其内容就是a的地址,假设写成“%d,&p是错的。第8章 指针8.1.3 指针运算1. 1. 指针的赋值运算指针的赋值运算1 1将变量地址值赋给指针变量,使指针指向该将变量地址值赋给指针变量,使指针指向该变量。变量。设有如下定义:设有如下定义: int a,b, int a,b,* *pa,pa,* *pb;pb; float float * *pf;pf;第一行定义了整型变量第一行定义了整型变量a,ba,b及指针变量及指针变量pa,pbpa,pb。papa、pbpb还没有被赋值,因

8、此还没有被赋值,因此papa、pbpb没有指向任何变量没有指向任何变量, , 下面语句完成对下面语句完成对pa,pbpa,pb的赋值:的赋值: pa=&a; pa=&a; pb=&b; pb=&b;第8章 指针例如:int j,k; int *pointer1,*pointer2; pointer1=&j;pointer2=&k; pointer1jpointer2k第8章 指针(2) 一样类型的指针变量间的赋值一样类型的指针变量间的赋值 pa与pb都是整型指针变量,它们间可以相互赋值,如:pb=pa; 即 pa,pb都指向变量a,此时a、*pa

9、、*pb是等价的。指针指向变化如以下图:留意:只需一样类型的指针变量才干相互赋值,如留意:只需一样类型的指针变量才干相互赋值,如pf=pa;是不允许的。由于是不允许的。由于pa是整型指针是整型指针,pf是浮点型指针。是浮点型指针。&a&bpapba,*pab,*pb&a&apapba,*pa,*pbb第8章 指针给指针变量赋空值给指针变量赋空值 给指针变量赋空值,阐明该指针不指向任何变量。 “空指针值用NULL表示,NULL是在头文件stdio.h中预定义的常量,其值为,在运用时应加上预定义行,如: #include stdio.h int *pa=NULL;

10、亦可以用下面的语句给指针赋“空值: pa=0; 或: pa=0; 这里指针pa并非指向0地址单元,而是具有一个确定的“空值,表示pa不指向任何变量。留意:指针虽然可以赋值0,但却不能把其它的常量地址直接赋给指针。例如: pa=4000; 是非法的。第8章 指针例 8.1 指针定义与初始化main()int a,b;int *pointer_1,*pointer_2;a=100;b=10;pointer_1=&a; pointer_2=&b; printf (%d,%dn,a,b);printf(%d,%dn,*pointer_1,*pointer_2); 第8章 指针程序运转结

11、果:100,10100,10&a&bbPointer_1Pointer_2a*pointer_1*pointer_2第8章 指针例8.2 从键盘上输入两个整数到a、b,按由大到小输出。#include main( ) int a,b,*pa=&a,*pb=&b,*p;/*定义指针变量pa、pb,如下页图a*/ scanf(%d%d,&a,&b); if (*pa*pb) p=pa; /*进展指针交换,如下页图b,c*/ pa=pb; pb=p; printf(n a=%d,b=%dn,a,b); printf(n max=%d,min=%d,*p

12、a,*pb); /* pa指向大数,pb指向小数*/第8章 指针假设输入: 12 22输出结果: a=12,b=22 max=22,min=12 (b) (c)指针变化表示图1222ppapb1222ppapbpapbab第8章 指针2. 2. 指针的算术运算指针的算术运算 (1) 加减运算: 一个指针可以加、减一个整数n,其结果与指针所指对象的数据类型有关。指针变量的值应添加或减少“nsizeof(指针类型)。 加减运算常用于数组的处置。对指向普通数据的指针,加减运算无实践意义。例如: int a10,*p=a,*x; x=p+3; /*实践上是p加上3*2个字节赋给x, x指向数组的第三个

13、分量*/ 对于不同基类型的指针,指针变量“加上或“减去一个整数n所挪动的字节数是不同的。例如: float a10, *p=a, *x; p=p+3; /*实践上是p加上3*4个字节赋给x, x依然指向数组的第三个分量*/ 第8章 指针 (2) 自增自减运算指针变量自增、自减运算具有上述运算的特点,但有前置后置、先用后用的思索,务请小心。 例如: int a10, *p=a, *x; x=p+; /* x第一个元素分量, p指向第二个元素*/ x=+p; /* x、 p均指向数组的第二个分量*/* p+相当于*p+ +。*p+与*p+ 含义不同,前者表示地址自增,后者表示当前所指向的数据自增。

14、 第8章 指针2. *&a的含意是什么? (答:a )3. (*p)+相当于什么? (答:a+ )思索:1.假设有定义 int a,*p; 执行了“p=&a,那么: “&*p的含意是什么?(答:相当于&a )第8章 指针 3. 3.指针的关系运算指针的关系运算 与根本类型变量一样,指针可以进展关系运算。与根本类型变量一样,指针可以进展关系运算。在关系表达式中允许对两个指针进展一切的关系运算。假设在关系表达式中允许对两个指针进展一切的关系运算。假设p,q是两个同类型的指针变量,那么:是两个同类型的指针变量,那么:pq,p=q都是允许的。都是允许的。 指针的关系运算

15、在指向数组的指针中广泛的运用,假设指针的关系运算在指向数组的指针中广泛的运用,假设 p、q是指向同一数组的两个指针,执行是指向同一数组的两个指针,执行pq的运算,其含义为,的运算,其含义为,假设表达式结果为真非值,那么阐明假设表达式结果为真非值,那么阐明p所指元素在所指元素在q所指所指元素之后。或者说元素之后。或者说q所指元素离数组第一个元素更近些。所指元素离数组第一个元素更近些。 留意:在指针进展关系运算之前,指针必需指向确定的变量留意:在指针进展关系运算之前,指针必需指向确定的变量或存储区域,即指针有初始值;另外,只需一样类型的指针才或存储区域,即指针有初始值;另外,只需一样类型的指针才干

16、进展比较。干进展比较。 第8章 指针8.1.4 8.1.4 多级指针多级指针 把指向指针型数据的指针变量称为指向指针的指针,或称多级指针。二级指针的定义方式如下: 数据类型 *指针变量例如: int a,*p,*pp; a=22; p=&a; pp=&p;假设变量a的地址为4000,指针p的地址为4100,二级指针pp的地址为4800。a、p、pp三者的关系如上图。&p=4100&a=400022pp(4800) p(4100) a(4000)第8章 指针8.2 指针与函数8.2.1 8.2.1 指针作为函数参数指针作为函数参数 利用指针作函数参数,可以实现函数

17、利用指针作函数参数,可以实现函数之间多个数据的传送,当形参为指针变量时,之间多个数据的传送,当形参为指针变量时,其对应实参可以是指针变量或存储单元地址。其对应实参可以是指针变量或存储单元地址。 函数形参为指针变量,用指针变量或变函数形参为指针变量,用指针变量或变量地址作实参量地址作实参例例8.3 8.3 编写一个交换两个变量的函数,在主编写一个交换两个变量的函数,在主程序中程序中 调用,实现两个变量值的交换。调用,实现两个变量值的交换。第8章 指针程序如下:#includemain() int a,b; int *pa,*pb; void swap(int *p1,int *p2); /*函数

18、声明函数声明*/ scanf(%d%d,&a,&b); pa=&a; /* pa指向变量指向变量a */ pb=&b; /* pb指向变量指向变量b */ swap(pa,pb); printf(na=%d,b=%dn,a,b);或:swap(&a,&b);第8章 指针接上页:void swap(int *p1,int *p2)int temp; temp=*p1; /*交换指针交换指针p1、p2所指向的变量的值所指向的变量的值*/ *p1=*p2; *p2=temp; 程序运转结果如下:程序运转结果如下: 输入:输入: 12 22 输出:输出:

19、 a=22,b=12第8章 指针两点阐明: (1) 假设在函数体中交换指针变量的值,实参a、b的值并不改动,指针参数亦是传值。 例如: int *p; p=p1; p1=p2; p2=p; 不要希望如此完成处置。 (2) 函数中交换值时不能运用无初值的指针变量作暂时变量。 例如: int *p; *p=*p1; *p1=*p2; *p2=*p; p无确定值,对 p的运用能够带来不可预期的后果。第8章 指针8.2.2 指针函数指针函数指针函数:是指前往值为指针的函数是指前往值为指针的函数指针函数的定义方式:指针函数的定义方式: 类型标示符类型标示符 *函数名参数函数名参数例如:例如:int *f

20、un(int a,int b) 函数体语句函数体语句 在函数体中有前往指针或地址的语句,形如在函数体中有前往指针或地址的语句,形如: return (&变量名变量名);或或 return (指针变量指针变量);并且前往值的类型要与函数类型一致。并且前往值的类型要与函数类型一致。 第8章 指针例8.3 分析如下程序main( ) int a,b,*p; int *max(int x,int y); scanf(“%d,%d,&a,&b); p=max(a,b); printf(“max=%d,*p); int *max(int x,int y) if (xy) retur

21、n (&x); else return (&y); 第8章 指针8.2.3 指向函数的指针 一个函数包括一组指令序列,存储在某一段内存中,这段内一个函数包括一组指令序列,存储在某一段内存中,这段内存空间的起始地址称为函数的入口地址存空间的起始地址称为函数的入口地址 称函数入口地址为函数的指针。函数名代表函数的入口地址称函数入口地址为函数的指针。函数名代表函数的入口地址 可以定义一个指针变量,其值等于该函数的入口地址,指向这可以定义一个指针变量,其值等于该函数的入口地址,指向这个函数,这样经过这个指针变量也能调用这个函数。这种指针变个函数,这样经过这个指针变量也能调用这个函数。这

22、种指针变量称为指向函数的指针变量。量称为指向函数的指针变量。定义指向函数的指针变量的普通方式为:定义指向函数的指针变量的普通方式为: 类型标识符类型标识符*指针变量名指针变量名)( ); 例如:例如: int (*p)(); /* 指针变量指针变量p可以指向一个整型函数可以指向一个整型函数*/ float (*q)(); /* 指针变量指针变量q可以指向一个浮点型函数可以指向一个浮点型函数*/第8章 指针 刚定义的指向函数的指针变量,亦象其它指针变量一样要赋刚定义的指向函数的指针变量,亦象其它指针变量一样要赋以地址值才干援用。当将某个函数的入口地址赋给指向函数的以地址值才干援用。当将某个函数的

23、入口地址赋给指向函数的指针变量,就可用该指针变量来调用所指向的函数指针变量,就可用该指针变量来调用所指向的函数 给函数指针赋初值:将函数名函数的入口地址值赋给指给函数指针赋初值:将函数名函数的入口地址值赋给指针变量针变量 例如例如 int m, (*p)( ); int max(int a,int b);那么可以那么可以 p=max; /* p指向函数指向函数max() */指针调用函数的指针调用函数的 普通方式为:普通方式为: (*指针变量指针变量)( 实参表实参表); 如上例:如上例:m=(*p)(12,22); /*比较比较 m=max(12,22); */第8章 指针留意: 用函数指针

24、调用函数是间接调用,没有参数类型阐明,用函数指针调用函数是间接调用,没有参数类型阐明,C编译系统也无法进展类型检查,因此,在运用这种方编译系统也无法进展类型检查,因此,在运用这种方式调用函数时要特别小心。实参一定要和指针所指函数式调用函数时要特别小心。实参一定要和指针所指函数的形参类型一致。的形参类型一致。 函数指针可以作为函数参数,此时,当函数指针每次函数指针可以作为函数参数,此时,当函数指针每次指向不同的函数时,可执行不同的函数来完成不同的功指向不同的函数时,可执行不同的函数来完成不同的功能能 例例 8.4 函数函数max()用来求一维数组的元素的最大值,在用来求一维数组的元素的最大值,在

25、主调函数中用函数名调用该函数与用函数指针调用该函主调函数中用函数名调用该函数与用函数指针调用该函数来实现。数来实现。第8章 指针程序如下: #include stdio.h #define M 8 main() float sumf,sump; float aM=11,2,-3,4.5,5,69,7,80; float (*p)(); /*定义指向函数的指针p*/ float max(float a,int n); /*函数声明*/ p=max; /*函数名函数入口地址赋给指针p*/ sump=(*p)(a,M); /*用指针方式调用函数*/ sumf=max(a,M); /*用函数名调用ma

26、x()函数*/ printf(sump=%.2fn,sump); printf(sumf=%.2fn,sumf); 第8章 指针程序接上页:float max(float a,int n) int k;float s;s=a0;for (k=0;kn;k+) if (sak) s=ak; return s;程序运转结果:sump=80.00 sumf=80.00第8章 指针指向函数的指针的运用步骤:1 定义一个指向函数的指针变量,形如: float (*p)();2 为函数指针赋值,格式如下: p=函数名; 留意:赋值时只需给出函数名,不要带参数。3 经过函数指针调用函数,调用格式如下: s=

27、(*p)(实参);第8章 指针8.3 指针与数组8.3.1 指向一维数组的指针指向一维数组的指针数组名是一个常量指针,它的值为该数组的首地址数组名是一个常量指针,它的值为该数组的首地址 1.指向数组的指针的定义方法与指向根本类型变量指向数组的指针的定义方法与指向根本类型变量的指针的定义方法一样,例如:的指针的定义方法一样,例如:int a10=1,3,5,7,9;int *p;p=&a2; (把数组元素把数组元素a2的地址赋给指针变量的地址赋给指针变量p)p=a; (把数组的首地址赋给指针变量把数组的首地址赋给指针变量p)第8章 指针C言语规定:数组名代表数组首地址,是一个地址常量。因

28、此,下面两个语句等价: p=&a0; p=a;在定义指针变量的同时可赋初值: int a10, *p=&a0; (或 int *p=a;)等价于:int *p; p=&a0; 两句。第8章 指针指向数组的指针变量p&a013151719pa0:a9p9a+0p+1 或 a+1p+9 或 a+9*a+9) 或*(p+9)第8章 指针2.经过指针援用数组元素 *p=5;表示对p当前所指的数组元素赋以一个值5。C规定:p+1指向数组的下一元素(而不是将p值简单地加1)。p+1意味着使p的原值地址加d个字节d为一个数组元素所占的字节数。假设p的初值为&a0,那么

29、:1p+i和a+i就是ai的地址,或者说它们指向a数组的第i个元素见下页图。2*(p+i)或*(a+i)是p+i或a+i所指向的数组元素,即ai。3指向数组的指针变量也可以带下标,如pi与*(p+i)、 ai等价 。第8章 指针*(p+i)a数组a0a1a2aia9pp+1,a+1p+i, a+ip+9, a+9 综上所述,援用一个数组元素有二法: 1下标法:如ai方式; 2指针法:如*(a+i)或 *(p+i)。其中a是数组名,p是指向数组的指针变量,其初值p=a。第8章 指针main()int a10;int i;for (i=0;i10;i+)scanf(%d,&ai);prin

30、tf(n);for (i=0;i10;i+)printf(%d, ai ) ;例8.5 用三种方法输出数组全部元素。(1)下标法第8章 指针main()int a10;int i;for (i=0;i10;i+)scanf(%d,&ai);printf(n);for (i=0;i10;i+)printf(%d, *(a+i) );(2)经过数组名计算数组元素地址经过数组名计算数组元素地址,输出元素的值输出元素的值第8章 指针(3)用指针变量指向数组元素main()int a10;int *p,i;for (i=0;i10;i+)scanf(%d,&ai);printf(n);f

31、or (p=a;p(a+10);p+)printf(%d, *p ); 三种方法的比较:三种方法的比较:用下标法比较直观,能直接知道是第几个元素;用下标法比较直观,能直接知道是第几个元素;而用指针法那么执行效率更高。而用指针法那么执行效率更高。第8章 指针运用指针变量时,应留意:1指针变量可实现使本身的值改动。 P+合法;但a+不合法a是数组名,代表数组首地址,在程序运转中是固定不变的。2要留意指针变量的当前值。main()int a10;int *p, i;p=a;for ( ;pa+10;p+) scanf(%d,p);printf(n);for ( ;p(a+10);p+)printf(

32、%d, *p ); 不能&p添加:p=a;第8章 指针3*p+相当于*(p+),由于*与+优先级一样,且结合方向从右向左,其作用是先获得p指向变量的值,然后执行p=p+1;4*(p+)与*(+p)意义不同,后者是先p=p+1,再获得p指向的变量值。 假设p=a,那么输出*(p+)是先输出a0,再让p指向a;输出*(+p)是先使p指向a,再输出p所指的a。5*p+表示的是将p指向的变量值+ 第8章 指针8.3.2 二维数组与多维数组的指针表示法 1.二维数组的地址二维数组的地址设有一个二维数设有一个二维数 组组a,它有三行四列它有三行四列: int a34;数组名数组名a: 代表整个二维

33、数组的首地址,也就代表整个二维数组的首地址,也就是第是第0行的首地址。行的首地址。a+i: 代表第代表第i行的首地址。行的首地址。(见下页图见下页图) 第8章 指针数组名a代表整个二维数组的首地址:a0a1a2a=19173111951321上图 a数组包含三个元素:a0,a1,a2. 而每个元素又是一个一维数组,它包含4个元素(即4个列元素),如:a0又包含:a00,a01,a02,a03.71523第8章 指针 一维数组名ai: 代表第i 行的首地址,即第i行中第0列元素的地址既&ai0)。 ai+j: 代表第i行中的第j个元素的地址,即为&aij。 留意地址变化的单位数值

34、在不同的场所的实践字节数是不同的: “a+1中的“1实践代表数组中一行元素所占的总字节数; “ai+1中的“1 代表数组中一个元素所占的字节数。 第8章 指针a+2 a数组a0a1a2aa+1(2000)(2019)(2019)a代表第0行的首地址,a+1代表第1行的首地址,a+2代表第2行的首地址.每行存放4个整型数据(即1个元素占2个字节),因此,这里+1的含义是:+4*2=+8个字节.第8章 指针 2000120193201952019720199201911201913201915201917202119202021202223aa+1a+2a0+1 a0+2 a0+3行地址,元素地址

35、的表示法第8章 指针例例8.6 8.6 用指针表示法输出二维数组的各元素。用指针表示法输出二维数组的各元素。#includemain()static int a23=0,1,2,3,4,5; int k,j,*p; for (j=0;j2;j+) /* 方式1 */ for (k=0;k3;k+) printf(%5d,*(aj+k); /* aj是j行首地址,aj+k是j行k列元素的地址*/ putchar(n); putchar(n);第8章 指针接上页:for (j=0;j2;j+) /* 方式方式2 */ for (k=0;k3;k+) printf(%5d,*(*(a+j)+k);

36、/* *(a+j)是是j行首地址,行首地址,*(a+j)+k是是j行行k列元素的地址列元素的地址*/ putchar(n); p=a; /* p指向数组的第一个元素指向数组的第一个元素 */ for (j=0;j2;j+) /* 方式方式3 */ for (k=0;k=n) p+=n-1; /*指针指到要复制的第一个字符指针指到要复制的第一个字符 */ 第8章 指针for (;*p!=0;p+,q+) *q=*p; *q=0; /* 字符串以0 结尾 */ printf(String a : %sn,a); printf(String b : %sn,b); 输入: 3输出: computer

37、 mputer第8章 指针8.4.2 字符串数组字符串数组字符串数组:是指数组中的每个元素都是一个存字符串数组:是指数组中的每个元素都是一个存 放放字符串的数组。字符串的数组。字符串数组可以用一个二维字符数组来存储。字符串数组可以用一个二维字符数组来存储。例如:例如:char languge3 10;数组的第一个下标决议字符串的个数,第二个下标数组的第一个下标决议字符串的个数,第二个下标是字符串的最大长度实践最多是字符串的最大长度实践最多9个字符,个字符,0占占一位置。一位置。可以对字符串数组赋初值。例如:可以对字符串数组赋初值。例如:char languge3 10;=“Basic, “c+

38、, “pascal第8章 指针8.5 8.5 指针数组与命令行参数指针数组与命令行参数8.5.1 8.5.1 指针数组指针数组 指针数组:是指针变量的集合。即它的每一个指针数组:是指针变量的集合。即它的每一个元素都是指针变量,且都具有一样的存储类元素都是指针变量,且都具有一样的存储类别和指向一样的数据类型。别和指向一样的数据类型。指针数组的定义方式为:指针数组的定义方式为: 类型标识符类型标识符 * *数组名数组名 数组长度阐明数组长度阐明 ;例如:例如: int int * *p10;p10;由于由于 比比* *的优先级高,因此的优先级高,因此p p先与先与 10 10结合结合成成p10p1

39、0,而,而p10p10正是数组的定义方式,共正是数组的定义方式,共有有1010个元素。最后个元素。最后p10p10与与* *结合结合, ,表示它的表示它的各元素可以指向一个整型变量。各元素可以指向一个整型变量。第8章 指针指针数组广泛运用于对字符串的处置指针数组广泛运用于对字符串的处置例如有定义:例如有定义: char *p3;定义了一个具有三个元素定义了一个具有三个元素p0,p1,p2的指针数组。的指针数组。每个元素都可以指向一个字符数组,或字符串。每个元素都可以指向一个字符数组,或字符串。假设利用数组初始化,那么:假设利用数组初始化,那么:char *p3= “Basic, “c+, “p

40、ascal; P0指向字符串指向字符串“Basic;P1指向字符串指向字符串“c+;P2指向字符串指向字符串“pascal ;第8章 指针例8.9 字符指针数组的赋值 #define NULL 0 main( ) static char a =“Fortran; static char b =“COBOL; static char c =“Pascal; int i; char *p4; p0=a; p1=b; p2=c; p3=NULL; for (i=0;pi!=NULL;i+) printf(“Language %d is %sn,i+1,pi); 第8章 指针例8.10 有假设干本书,

41、将书名按字典顺序排序#include#includemain() char *bname=Programming in ANSI C,BASIC,Visual C+ 6.0 Programming ,TRUBO C 2.0; int i,m; void sort(char *name,int); m=sizeof(bname)/sizeof(char *); /*字符串个数字符串个数*/ sort(bname,m); /* 排序,改动指针的衔接关系排序,改动指针的衔接关系*/ printf(n); for (i=0;im;i+) /* 输出排序结果输出排序结果*/ printf(%8s,bna

42、mei);第8章 指针void sort(char *name, int n) /*选择排序*/char *t; int i,j,k; /* k记录每趟最小值下标 */ for (i=0;in-1;i+) k=i; for (j=i+1;j0) k=j; /* 第j个元素更小*/ if (k!=i) /* 最小元素是该趟的第一个元素 那么不需交换 */ t=namei;namei=namek;namek=t; 输出结果为: BASIC Programming in ANSI C TRUBO C 2.0 Visual C+ 6.0 Programming 第8章 指针留意:留意: (1)字符数组

43、中每个元素可存放一个字符,而字符指针变量字符数组中每个元素可存放一个字符,而字符指针变量存放字符串首地址,而不是存放在字符指针变量中。存放字符串首地址,而不是存放在字符指针变量中。 (2)对字符数组,与普通数组一样,不能对其进展整体赋值,对字符数组,与普通数组一样,不能对其进展整体赋值,只能给各个元素赋值,而字符指针变量可以直接用字符串常量只能给各个元素赋值,而字符指针变量可以直接用字符串常量赋值。例如,假设有如下定义:赋值。例如,假设有如下定义: char a10; char *p;那么语句那么语句 a=computer;是非法的,由于数组名;是非法的,由于数组名a是一是一个常量指针,不能对其赋值。只能对各个元素分别赋值:个常量指针,不能对其赋值。只能对各个元素分别赋值: a0=c;a1=o;a2=m;a3=p;a7=r;但语句但语句: p=computer; 是合法的。是合法的。 第8章 指针8.5.2 8.5.2 指针数组与命令行参数指针数组与命令行参数 在操作系统命令形状下,可以输入程序或命令使其运转,称命令行形状。输入的命令或运转程序及该命令或程序所需的

温馨提示

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

评论

0/150

提交评论