中国高校课件下载中心 》 教学资源 》 大学文库

《C语言程序设计》课程授课教案(讲义)指针应用

文档信息
资源类别:文库
文档格式:DOC
文档页数:14
文件大小:72.51KB
团购合买:点击进入团购
内容简介
《C语言程序设计》课程授课教案(讲义)指针应用
刷新页面文档预览

·38· C程序设计要点分析与题解 第5章指针 5.1指针和地址 指针是C语言中一个极其重要的概念,也是C语言程序设计的难点。 L,指针的定义 债地指针变男是用于存放头他变接的地丝简玫为指针指针变所金的是内存约抗丽 个变量在内存中存储的位置。指针它本身也是一种变量,和其他变量一样。 要占有一定数量的存储空间,用来存放指针值(即地址)。 2.指针的作用 C语言中引入指针类型变量,不仅简单地实现了类似于机器间址操作的指令,更重要的 是使用指针可以实现程序设计中利用其他数据类型很难实现,甚至无法实现的工作。指针的 作用主要体现 (1)使代码更为紧凑和有效,提高了程序的效率。 (②)便于函数修改其调用参数,为函数间各类数据传递提供简捷而便利的方法。 (3)实现动态分配存储空间。 正确地使用指针会带来许多好处,但指针操作也有难以掌握的一面,若使用不当,可能 会产生程序失控甚至造成系统崩遗 5.2指针变量和指针运算符 1.指针变量及其说明 指针变量是存放地址的变量。和其他变量一样,必须在使用之前,加以定义说明。其定 义说明的一般形式 类型说明符 *指针变量名: 例如: int *P: 说明指针变量P是指向int类型变量的指针 char米s 说明指针变s是指向char类型变量的指针 float *f 说明指针变量f是指向f1oat类型变量的指针 Double *d: 说明指针变量d是指向double类型变量的指针。 static int pa:说明指针变量pa是指向int类型变量的指针,而pa本身的存储 类型是静态变量。 int *fpi: 说明fDi(0是一个函数,该函数返回指向int类型变量的指针。 Int (*pfi)() 说明p1是指向一个函数的指针 ,该函数返回int类型变量。 指针变量值表达的是某个数据对象的地址,只允许取正的整数值。然而,不能因此将它 与整数类型变量相混淆。所有合法指针变量应当是非0值。如果某指针变量取0值,即为L, 则表示该指针变量所指向的对象不存在。这是NULL在C语言中又一特殊用处。 2.指针运算符&和*

·38· C 程序设计要点分析与题解 第 5 章 指针 5.1 指针和地址 指针是 C 语言中一个极其重要的概念,也是 C 语言程序设计的难点。 1.指针的定义 指针变量是用于存放其他变量的地址,简称为指针。指针变量所包含的是内存地址,而 该地址便是另一个变量在内存中存储的位置。指针它本身也是一种变量,和其他变量一样, 要占有一定数量的存储空间,用来存放指针值(即地址)。 2.指针的作用 C 语言中引入指针类型变量,不仅简单地实现了类似于机器间址操作的指令,更重要的 是使用指针可以实现程序设计中利用其他数据类型很难实现,甚至无法实现的工作。指针的 作用主要体现如下: (1)使代码更为紧凑和有效,提高了程序的效率。 (2)便于函数修改其调用参数,为函数间各类数据传递提供简捷而便利的方法。 (3)实现动态分配存储空间。 正确地使用指针会带来许多好处,但指针操作也有难以掌握的一面,若使用不当,可能 会产生程序失控甚至造成系统崩溃。 5.2 指针变量和指针运算符 1.指针变量及其说明 指针变量是存放地址的变量。和其他变量一样,必须在使用之前,加以定义说明。其定 义说明的一般形式: 类型说明符 *指针变量名; 例如: int *P; 说明指针变量 P 是指向 int 类型变量的指针. char *s; 说明指针变量 s 是指向 char 类型变量的指针。 float *f; 说明指针变量 f 是指向 float 类型变量的指针。 Double *d; 说明指针变量 d 是指向 double 类型变量的指针。 static int pa; 说明指针变量 pa 是指向 int 类型变量的指针,而 pa 本身的存储 类型是静态变量。 int *fpi(); 说明 fpi()是一个函数,该函数返回指向 int 类型变量的指针。 Int (*pfi)(); 说明 pfi 是指向一个函数的指针,该函数返回 int 类型变量。 指针变量值表达的是某个数据对象的地址,只允许取正的整数值。然而,不能因此将它 与整数类型变量相混淆。所有合法指针变量应当是非 0 值。如果某指针变量取 0 值,即为 NULL, 则表示该指针变量所指向的对象不存在。这是 NULL 在 C 语言中又一特殊用处。 2.指针运算符&和*

第5章指针 ·39· 指针变量虽是正的整数值,但不是整数类型变量。指针变量最基本的运算符是&和*。 () 取地址 它的作用是返回后随变量(操作数)的内存地址。请注意,它只能用于一个具体的变量或 数组元素,不可用于表达式。 例: int *p: in m=200: p=&m: 这是将整数类型变量m的地址赋给整数类型的指针变量p。 (2)*一一取值 它的作用是返回其后随地址(指针变量所表达的地址值)中的变量值。 例: int *p: int m: int n: =200: p=&m 这是将指针变量p所指向的整数类型变量(即m)的值赋给整数类型变量。其结果与赋值 语句=n:一样,但操作过程用了指针变量p。 &与*运算符互为逆运算。对指针变量px指向的目标变量和x实行取址运算: &(px) 其结果就是px。对变量x的地址实行取值运算 *(&X) 其结果就是x。 注意,x与*px同级别可写成x=和x或和x=x。px与&x同级别可写成px=&x,但决不可写成 &x=DX,也不能写成D 3指针的初始化和赋值运算 指针的初始化往往与指针的定义说明同时完成,初始化一般格式 类型说明符 指针变量名=初始地址值: 例如: char c: char *charp=&c 请注意 ·任何一个指针在使用之前: ①必须加以定义说明。 ②必须经过初始化。 ③未经过初始化的指针变量禁止使用

第 5 章 指针 ·39· 指针变量虽是正的整数值,但不是整数类型变量。指针变量最基本的运算符是&和*。 (1)&——取地址 它的作用是返回后随变量(操作数)的内存地址。请注意,它只能用于一个具体的变量或 数组元素,不可用于表达式。 例: int *p; int m; m=200; p=&m; 这是将整数类型变量 m 的地址赋给整数类型的指针变量 p。 (2) *——取值 它的作用是返回其后随地址(指针变量所表达的地址值)中的变量值。 例: int *p; int m; int n; m=200; p=&m; n=*p; 这是将指针变量 p 所指向的整数类型变量(即 m)的值赋给整数类型变量 n。其结果与赋值 语句 m=n;一样,但操作过程用了指针变量 p。 &与*运算符互为逆运算。对指针变量 px 指向的目标变量*px 实行取址运算: &(*px) 其结果就是 px。对变量 x 的地址实行取值运算: *(&x) 其结果就是 x。 注意,x 与*px 同级别可写成 x=*px 或*px=x。px 与&x 同级别可写成 px=&x,但决不可写成 &x=px,也不能写成 px=x。 3.指针的初始化和赋值运算 指针的初始化往往与指针的定义说明同时完成,初始化一般格式: 类型说明符 指针变量名=初始地址值; 例如: char c; char *charp=&c; 请注意: ·任何一个指针在使用之前: ①必须加以定义说明。 ②必须经过初始化。 ③未经过初始化的指针变量禁止使用

·40 C程序设计要点分析与题解 ·在说明语句中初始化,也是把初始地址值赋给指针变量,只有在说明语句中,才允许这样 写。而在赋值语句中,变量的地址只能赋给指针变量本身。 ·指针变量初始化时,变量应当在前面说明过,才可使用&变量名作为指针变量的初始值 合则, 编译时将出错 ·必须以同类型数据的地址来进行指针初始化。 指针变量可以进行赋值运算,这种赋值运算操作也仅限制在同类之间才可实现。 例5.1:指针变量的引用。 int x=10 int*和l=&x,*p2: /体pl指向x/ p2=p1: /p2指向x*/ printf("%dn”,p2: 执行结果应显示:10 例5.2:指针变量的运算。 mainO char c='A' /变量c的初始值为'A'* char *charp=&c: /*变量c的地址作为指针变量charp的初始值* printf("%c%cn",c,*charp): c='B': /变量c赋值为'B'/ printf("%cc\n"c.*charp): *charp='a' /将指针变量charp所指向地址的内容改为'a'*/ printf(""c.charp): 执行结果应显示: AA BB 4.sizeof运算符 sizeof运算符可以准确地得到在当前所使用的系统中某一数据类型所占字节数。sizeof 运算的格式: i2e0f(举刑道明符) 其值为该类型变量所占字节数。用输出语句可方便地打印出有关信总,例如 printf("d\n",sizeof(int)): printf("d\n",sizeof(float)): printf("%d\n",sizeof(double)):

·40· C 程序设计要点分析与题解 ·在说明语句中初始化,也是把初始地址值赋给指针变量,只有在说明语句中,才允许这样 写。而在赋值语句中,变量的地址只能赋给指针变量本身。 ·指针变量初始化时,变量应当在前面说明过,才可使用&变量名作为指针变量的初始值。 否则,编译时将出错。 ·必须以同类型数据的地址来进行指针初始化。 指针变量可以进行赋值运算,这种赋值运算操作也仅限制在同类之间才可实现。 例 5.1:指针变量的引用。 main() { int x=10 int *p1=&x,*p2; /* p1 指向 x */ p2=p1; /* p2 指向 x */ printf(″%d\n″,*p2); } 执行结果应显示:10 例 5.2:指针变量的运算。 main() { char c=′A′; /*变量 c 的初始值为′A′*/ char *charp=&c; /*变量 c 的地址作为指针变量 charp 的初始值*/ printf(″%c%c\n″,c,*charp); c=′B′; /*变量 c 赋值为′B′*/ printf(″%c%c\n″,c,*charp); *charp=′a′; /*将指针变量 charp 所指向地址的内容改为′a′*/ printf(″%c%c\n″,c,*charp); } 执行结果应显示: AA BB aa 4.sizeof 运算符 sizeof 运算符可以准确地得到在当前所使用的系统中某一数据类型所占字节数。sizeof 运算的格式: sizeof(类型说明符) 其值为该类型变量所占字节数。用输出语句可方便地打印出有关信息,例如: printf(″%d\n″,sizeof(int)); printf(″%d\n″,sizeof(float)); printf(″%d\n″,sizeof(double));

第5章指针 41· 5.指针的算术运算 指针的算术运算是按地址计算规则进行。由于地址计算与相应数据类型所占字节数有关 所以,指针的算术运算应考虑到指针所指向的数据类型。 指针的算术运算只有如下四种: 十,一,十十。一 (1)指针自增1运算++和指针自减1运算一一 指针自增运算意味若指针向后移动一个数据的位置,指向的地址为原来地址十sizeof(类 型说明符)。例如 int i,*p: p=&i: n++: 结果是p指向了变量i的地址+sizeof(int)。 (2)指针变量的+和 指针变量px加(什)正整数,表示指针向后移过n个数据类型,使该指针所指向的地址 变为原指向的地址十sizeof(类型说明符)n。指针变量减(一)正整数n,表示指针往前移回n 个数据,使该指针所指向的地址变为原指向的地址一sizeof(类型说明符)知。 6.指针的关系运算 指向同一种数据类型的指针,才有可能进行各种关系运算。指针的关系运算符包括有: 它们实际所进行的是两个指针所指向的地址的比较。 >不同类型指针之间的比较是没有意义的。 指针与整数常量或变量的比较也没有意义。 独常量0是例外的, 一个指针变量为0(L)表示该指针指向空间不存在,称为 空指 如果有一个指针p,可以用p=0或p!=0来判断p是否为空指针。 7.使用指针编程中的常见错误 (①)使用未初始化的指针变量,例如: i0 intx,: x=0: 却=x: /*指针变量未初始化*/ 和未被初始化 (②)指针变量所指向的数据类型与其定义的类型不符,例如: main( float x,y:

第 5 章 指针 ·41· 5.指针的算术运算 指针的算术运算是按地址计算规则进行。由于地址计算与相应数据类型所占字节数有关, 所以,指针的算术运算应考虑到指针所指向的数据类型。 指针的算术运算只有如下四种: +,-,++,-- (1)指针自增 1 运算++和指针自减 1 运算-- 指针自增运算意味着指针向后移动一个数据的位置,指向的地址为原来地址+sizeof(类 型说明符)。例如: int i,*p; p=&i; p++; 结果是 p 指向了变量 i 的地址+sizeof(int)。 (2)指针变量的+和-运算 指针变量 px 加(+)正整数 n,表示指针向后移过 n 个数据类型,使该指针所指向的地址 变为原指向的地址+sizeof(类型说明符)*n。指针变量减(-)正整数 n,表示指针往前移回 n 个数据,使该指针所指向的地址变为原指向的地址-sizeof(类型说明符)*n。 6.指针的关系运算 指向同一种数据类型的指针,才有可能进行各种关系运算。指针的关系运算符包括有: ==,!=,<,<=,>,>=。 它们实际所进行的是两个指针所指向的地址的比较。 ➢ 不同类型指针之间的比较是没有意义的。 ➢ 指针与整数常量或变量的比较也没有意义。 ➢ 唯独常量 0 是例外的,一个指针变量为 0(NULL)表示该指针指向空间不存在,称为 空指针。 如果有一个指针 p,可以用 p==0 或 p!=0 来判断 p 是否为空指针。 7.使用指针编程中的常见错误 (1)使用未初始化的指针变量,例如: main() { int x,*p; x=0; *p=x; /*指针变量未初始化*/ . } *p 未被初始化。 (2)指针变量所指向的数据类型与其定义的类型不符,例如: main() { float x,y;

·42 C程序设计要点分析与题解 short int柳: D=&x: /数据类型不符* *p: X,y与和数据类型不符。 (③)指针的错误赋值,例如: 照in0 intx,和: x=10 D=x 错在以普通变量x赋给指针变量p。 (④)用局部变量的地址去初始化静态的指针变量,例如: int glo: int loc1,loc2; static int *gp=&glo: static int *lp=&loc1: int杠p=&1oc2: 用局部变量1oc1去初始化静态的指针变量1p是错误的。 5.3指针与函数参数 在函数调用中,使用指针作为参数,可以改变调用环境中的变量之值。这是使用一般变 量作为参数所难以实现的。让我们来观察一个函数的调用: 例5.3:x和y的值互换。 swapl(x,y) int x,y: /*局部变量不能带出函数*/ int temp: temp=x: x=y: v=temp:

·42· C 程序设计要点分析与题解 short int *p; p=&x; /*数据类型不符*/ y=*p; . } x,y 与*p 数据类型不符。 (3)指针的错误赋值,例如: main() { int x,*p; x=10 p=x . } 错在以普通变量 x 赋给指针变量 p。 (4)用局部变量的地址去初始化静态的指针变量,例如: int glo; func() { int 1oc1,1oc2; static int *gp=&glo; static int *1p=&1oc1; int *rp=&1oc2; . } 用局部变量 1oc1 去初始化静态的指针变量 1p 是错误的。 5.3 指针与函数参数 在函数调用中,使用指针作为参数,可以改变调用环境中的变量之值。这是使用一般变 量作为参数所难以实现的。让我们来观察一个函数的调用: 例 5.3:x 和 y 的值互换。 swap1(x,y) int x,y; /*局部变量不能带出函数*/ { int temp; temp=x; x=y; y=temp;

第5章指针 43· int a,b: a=10: b=20: swapl (a,b) printf("a=d%d b=%d\n",a,b): 执行结果: a=10b=20 虽然,swapl(0函数中 ,主函数对该函数 a与b之值并未交换。 改用指针作为参数,也就是用变量的地址作为参数,即所谓“传址”(或称为“传名”) 的调用,就可改变相应地址中的变量。 例5.4:x和y值互换。 swap2(px,py) int *px,*py: /体地址变量/ int temps temp-*px: *px=*py: *py=temp: /*返回后地址变量释放*/ int a,b; a=10: b=20: swap2(&a.&b): /条传地址*/ printf("a-d b-dn",a.b): /得到交换的值*/ 执行结果: a=20b=10 a与b的地址,即&a与&b并未交换,但其值已被交换

第 5 章 指针 ·43· } main() { int a,b; a=10; b=20; swap1(a,b); printf(″a=d%d b=%d\n″,a,b); } 执行结果: a=10 b=20 虽然,swap1()函数中,x 和 y 的值互相交换了,但 x,y 是局部变量,主函数对该函数 的调用 swap1(a,b)是“传值”调用,x 与 y 的交换结果,不可能影响调用者中的变量 a,b, a 与 b 之值并未交换。 改用指针作为参数,也就是用变量的地址作为参数,即所谓“传址”(或称为“传名”) 的调用,就可改变相应地址中的变量。 例 5.4:x 和 y 值互换。 swap2(px,py) int *px,*py; /* 地址变量 */ { int temp; temp=*px; *px=*py; *py=temp; /* 返回后地址变量释放 */ } main() { int a,b; a=10; b=20; swap2(&a,&b); /*传地址*/ printf(″a=%d b=%d\n″,a,b); /*得到交换的值*/ } 执行结果: a=20 b=10 a 与 b 的地址,即&a 与&b 并未交换,但其值已被交换

·44 C程序设计要点分析与题解 5.4指针、数组和字符串指针 1.指针和数组 用指针和用数组名访问内存的方式几乎完全一样,却又有微妙而重要的差别。指针是地 址变量,数组名则是固定的某个地址,是常量。 若定义一个数组: int a[1o]: 一个基地址开始的一块足够大的连续的空间,以包容a[0],a[1小. 回在内行生克有备地是a可的地,果空度下标烟列 若定义一个指针: int *p: 则意味者:p&a[0]:即 p指向aO p a D+2指向a[2】 p+i=&a[i]: +i指向a「i1(i=0,9) )在C语言中,数组名本身是指向零号元素的地址常量。因此,=&a0]可写成Da。 当作常量指针,它指向a[0]。p=a+i与p=&a[i]等价,故数组名可当指针用,它指向0号元 素。 (②)若定义p为指针,a为数组名,且p=a,则p+i指向a[i],a+i也指向a[i]。 这样,a[i]与*(p+i)或*(a+i)可看成是等价的,可互相替代使用。 注意: 由于a只是数组名,是地址常量,而不是指针变量,所以可以写p=a,但不能写ap,可 以用p+,但不能用a+。 2.字符串指针 在C语言中,可用char型数组来处理字符串,而数组又可用相应数据类型的指针来处理。 所以可以用char型指针来处理字符串。通常把char型指针称为字符串指针或字符指针。例 5.5:计算串长度的函数strlen0是使用字符串指针的 个实例。 strlen(s) char *s: int n: for(n=0:*s='10':s++) n++ return(n): main(

·44· C 程序设计要点分析与题解 5.4 指针、数组和字符串指针 1.指针和数组 用指针和用数组名访问内存的方式几乎完全一样,却又有微妙而重要的差别。指针是地 址变量,数组名则是固定的某个地址,是常量。 若定义一个数组: int a[10]; 则在内存中占有从一个基地址开始的一块足够大的连续的空间,以包容 a[0],a[1]., a[9]。基地址(或称为首地址)是 a[0]存放的地址。其他依下标顺序排列。 若定义一个指针: int *p; 则意味着:p=&a[0];即 p 指向 a[0] p+1 指向 a[1] p+2 指向 a[2] . p+i=&a[i]; p+i 指向 a[i] (i=0,.,9) (1)在 C 语言中,数组名本身是指向零号元素的地址常量。因此,p=&a[0]可写成 p=a,a 当作常量指针,它指向 a[0]。p=a+i 与 p=&a[i]等价,故数组名可当指针用,它指向 0 号元 素。 (2)若定义 p 为指针,a 为数组名,且 p=a,则 p+i 指向 a[i],a+i 也指向 a[i]。 这样,a[i]与*(p+i)或*(a+i)可看成是等价的,可互相替代使用。 注意: 由于 a 只是数组名,是地址常量,而不是指针变量,所以可以写 p=a,但不能写 a=p,可 以用 p++,但不能用 a++。 2.字符串指针 在 C 语言中,可用 char 型数组来处理字符串,而数组又可用相应数据类型的指针来处理。 所以可以用 char 型指针来处理字符串。通常把 char 型指针称为字符串指针或字符指针。例 5.5:计算串长度的函数 strlen()是使用字符串指针的一个实例。 strlen(s) char *s; { int n; for(n=0;*s!=′\0′;s++) n++ return(n); } main()

第5章指针 45· static char str[]=("Hello!"); mrea8:miier printf("%c\n",*(str+1)); 执行结果: 6 定义字符指针可以直接用字符串作为初始值,来初始化字符指针。例如: Ochar *message="Hello!": ②char*essage nessag Hello!" 这样的赋值并不是将字符串复制到指针中,只是使字符指针指向字符串的首地址。但对 于数组操作,例如: char text「80]: 则不可写成: text="Hello!": 因为,此处txt是数组名,而不是指针,只能按字符数组初始化操作。即: static char text[80]={"Hello!") 当字符串常量作为参数(实参)传递给函数时,实际传递的是指向该字符串的指针,并未 讲行字符串楼贝。例如: 例5.6:向字符指针赋字符串 main() char s=”Hello!”:/*相当于s数组*/ char *p: while(s!=\0) printf("%c”,*s+): printf("\n"): p=”Good-bye!”:/*指针指向字符串*/ while(知='o') printf("%c”,*+): printf("n") 执行结果: Hello! Good-bye

第 5 章 指针 ·45· { static char str[]={″Hello! ″}; printf(″%c\n″,*str); printf(″%d\n″,strlen(str)); printf(″%c\n″,*(str+1)); } 执行结果:H 6 e 定义字符指针可以直接用字符串作为初始值,来初始化字符指针。例如: ①char *message=″Hello!″; 或 ②char *message; message=″Hello!″; 这样的赋值并不是将字符串复制到指针中,只是使字符指针指向字符串的首地址。但对 于数组操作,例如: char text[80]; 则不可写成: text=″Hello!″; 因为,此处 text 是数组名,而不是指针,只能按字符数组初始化操作。即: static char text[80]={″Hello!″}; 当字符串常量作为参数(实参)传递给函数时,实际传递的是指向该字符串的指针,并未 进行字符串拷贝。例如: 例 5.6:向字符指针赋字符串 main() { char s=″Hello!″; /*相当于 s 数组*/ char *p; while(*s!=′\0′) printf(″%c″,*s++); printf(″\n″); p=″Good-bye!″; /*指针指向字符串*/ while(*p!=′\o′) printf(″%c″,*p++); printf(″\n″) } 执行结果: Hello! Good-bye!

·46 C程序设计要点分析与题解 此例中字符串是逐个字符输出,也可以字符指针为参量,作字符输出,例如: printf("%s”,s): 或 printf("%s",p); 输入函数scanf0也可以字符指针为参量,如: scanf("%s".p): 例5.7:以字符指针为参数来调用串比较函数strcomp0。 strcomp(s,t) char *s,*t: /形式参数为字符指针*/ for(:*s==*t:s++,t++) if(*s=='o') return(*s-*t): /字符串相同返回零值*/ main( static char s1]={"Hello!"): char*s2=”Hello” printf("dn",strcomp(s1,s2)): printf("d\n",strcomp("Hello",s2)): s和t初值已由实参传递讨来了,所以for语句的第一·个表达式为空语句。 例如:用指针处理字符串的拷贝,比用数组处理更精练 strcpy(s,t) char *s,*t: 国hi1e(*s++=*t++): 如果用数组处理则要复杂些,例如 strcpy(s,t) char s[],t[]: int i: i0: while((s[i]=t[i])!='\o') i++: 直接演化出指针处理,即:

·46· C 程序设计要点分析与题解 此例中字符串是逐个字符输出,也可以字符指针为参量,作字符输出,例如: printf(″%s″,s); 或 printf(″%s″,p); 输入函数 scanf()也可以字符指针为参量,如: scanf(″%s″,p); 例 5.7:以字符指针为参数来调用串比较函数 strcomp()。 strcomp(s,t) char *s,*t; /*形式参数为字符指针*/ { for(;*s==*t;s++,t++) if(*s==′\o′) return(0); return(*s-*t); /* 字符串相同返回零值 */ } main() { static char s1[]={″Hello!″}; char *s2=″Hello!″; printf(″%d\n″,strcomp(s1,s2)); printf(″%d\n″,strcomp(″Hello″,s2)); } s 和 t 初值已由实参传递过来了,所以 for 语句的第一个表达式为空语句。 例如:用指针处理字符串的拷贝,比用数组处理更精练 strcpy(s,t) char *s,*t; { while(*s++=*t++); } 如果用数组处理则要复杂些,例如: strcpy(s,t) char s[],t[]; { int i; i=0; while((s[i]=t[i])!=′\o′) i++; } 直接演化出指针处理,即:

第5章指针 47· strcpv(s,t) char*s,*t: while((*s=*t)!='lo') s++: t+: 优化后便是如前所示的指针处理方法的程序。其中,也使用了空语句(:),而且不必进 行与'10'的比较。 5.5指针数组 1.指针数组的定义和说明 同类指针变量的集合,就形成了指针数组。或者说,以指针变量为元素的数组,就称为 指针数组。这些指针变量应具有相同的存储类型,并且,指向的目标数据类型也应相同。 指针数组的一般表示格式 类型说明符 *指针数组名[元素个数]: 例如: int*知[2]: p[2]是含有p[0]和p[1]两个指针的指针数组,指向int型数据。 2.指针数组的初始化 指针数组的初始化可以在说明的同时进行。与一般数组一样,只有全局的或静态的指 数组才可进行初始化。而且,不能用局部变量的地址去初始化静态指针。 例5.8:指针数组。 #include static int b[2][3]=(,2,3,{4,5,6}: static int知b[门=b[0],b[1]}:/*指针数组指向行首*/ int i.i: for(i=0:i<2:i++){ for(i=0. i<3:j+) printf("b[sd][%d]-d",i.j.*(pb[i]+j)) printf("\n") } 执行结果:

第 5 章 指针 ·47· strcpy(s,t) char*s,*t; { while((*s=*t)!=′\o′) { s++; t++; } } 优化后便是如前所示的指针处理方法的程序。其中,也使用了空语句(;),而且不必进 行与′\0′的比较。 5.5 指针数组 1.指针数组的定义和说明 同类指针变量的集合,就形成了指针数组。或者说,以指针变量为元素的数组,就称为 指针数组。这些指针变量应具有相同的存储类型,并且,指向的目标数据类型也应相同。 指针数组的一般表示格式: 类型说明符 *指针数组名[元素个数]; 例如: int *p[2]; p[2]是含有 p[0]和 p[1]两个指针的指针数组,指向 int 型数据。 2.指针数组的初始化 指针数组的初始化可以在说明的同时进行。与一般数组一样,只有全局的或静态的指针 数组才可进行初始化。而且,不能用局部变量的地址去初始化静态指针。 例 5.8:指针数组。 #include <stdio.h> main() { static int b[2][3]={{1,2,3},{4,5,6}}; static int *pb[]={b[0],b[1]}; / *指针数组指向行首 */ int i,j; for(i=0;i<2;i++){ for(j=0;j<3;j++) printf(″b[%d][%d]=%d″,i,j,*(pb[i]+j)); printf(″\n″) } } 执行结果:

共14页,试读已结束,阅读完整版请下载
刷新页面下载完整文档
VIP每日下载上限内不扣除下载券和下载次数;
按次数下载不扣除下载券;
注册用户24小时内重复下载只扣除一次;
顺序:VIP每日次数-->可用次数-->下载券;
相关文档