C语言新教材PPT课堂课件-6-指针_第1页
C语言新教材PPT课堂课件-6-指针_第2页
C语言新教材PPT课堂课件-6-指针_第3页
C语言新教材PPT课堂课件-6-指针_第4页
C语言新教材PPT课堂课件-6-指针_第5页
已阅读5页,还剩74页未读 继续免费阅读

下载本文档

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

文档简介

1、1第六章 指针主要内容:6.1 指针和指针变量6.2 数组与指针6.3 字符串与指针6.4 指针数组和指向指针的指针2i2000100 地址变量名变量值int i=100;假设为i分配地址为2000的存储单元6.1 指针和指针变量6.1.1 指针的概念地址2000“指向”变量 i内存用户数据区变量 i100地址2000注意:变量的地址不同于变量名可用&i 获取32000100ii_pointer指针变量:用来存放地址的变量。将地址2000存放在变量i_pointer中2000是“变量的地址”i_pointer称为“指针变量”4指针的概念 两种观点:1、指针是指针变量的简称。 C语言之父丹尼斯里

2、奇:A pointer isa variable that contains the address of a variable. 2、指针是地址的形象化称谓。 我国著名的C语言教材编写者谭浩强:变量的地址称为该变量的“指针”。5指针是C的精华,没掌握指针就等于没掌握C语言。指针的意义C程序设计中使用指针可以:有效地表示复杂的数据结构动态分配内存方便地使用数组和字符串得到多于一个的函数返回值使用指针,可以使程序更加简洁、紧凑、高效6指针变量的定义: 类型名 *指针变量名;如:int *p ;定义 p 为指向整型(基类型为整型)的指针变量,即 p 中可以存放一个整型数据的地址。6.1.2 指针变

3、量的定义“*”表示所定义的变量为指针型变量定义指针所指向的数据类型,也叫“基类型名”71. 取地址运算符 & 用法:&变量名 功能:取变量的地址 单目运算符,“右”结合性,优先级220003iC程序不关心变量的地址具体值,需要地址时,用 &i 取地址&i6.1.3 指针运算8四、访问指针变量所指单元举例:如果有定义 int a,b,*p; p=&a; *p=78; 等价于 a=78 ; b=*p+4; 等价于 b=a+4 ;2.间接访问运算符 * 用法:*指针变量名 功能:对指针变量所指单元间接访问,即引用指针变量所指单元的值 单目运算符,“右”结合性,优先级2注意:定义指针变量时的“*”与其

4、它位置出现的“*”含义不同 前者表示p是指针变量 后者表示对指针变量所指单元进行间接访问*p是对变量a的间接访问a是对变量的直接访问9目的:将指针变量指向一个存储单元三、指针变量的赋值指向变量的指针变量的赋值: 指针变量名=变量地址; 如 int a,*p; p=&a ; 指向变量的指针变量的初始化: 类型名 *指针变量名=变量地址; 如 int a , *p=&a ;&aap注意指针变量初始化中,&a是赋给p,而不是*p ; 不允许用具体地址值赋值,如p=2000;10#include void main( )int a,b,*pa,*pb,*p; scanf(%d,%d,&a,&b); p

5、a=&a;pb=&b;例 通过指针变量实现两个数的交换(1)p=pa;pa=pb;pb=p;printf(a=%d,b=%dn,a,b );3520002002abpa pbp2000200220022000该程序交换的不是a、b的值,而是交换两个指针变量的值(即指向)。2000实现a、b交换了吗?例6.3-无法实现!11例 通过指针变量实现两个数的交换(2)abpapbt200020022000200235printf(a=%d,b=%dn, a,b );该程序交换的是两个指针变量所指单元的值,即变量a和b的值。53#include void main( )int a,b,*pa,*pb,t

6、;/*非int*t;*/ scanf(%d,%d,&a,&b); pa=&a;pb=&b;t=*pa;*pa=*pb;*pb=t;3例6.312指针变量与普通变量的对比共性在内存中占据一定大小的存储单元先定义,后使用类型定义后不能改变(普通变量只能存放所定义类型的数据,指针变量只能指向所定义类型的存储单元特殊性指针变量的内容只能是地址,而不能是数据指针变量只有赋值后才有明确的指向,否则无确定的所指存储单元可访问136.2 数组与指针6.2.1 指向一维数组的指针数组的首地址 用数组名表示int a 10 ;a14int a 10 ;一、一维数组元素的地址地址1aa+1a+3a+2a+6a+5a

7、+4a+9a+8a+7地址2&a0&a1&a2&a3&a4&a5&a6&a7&a8&a9a0a1a2a3a4a5a6a7a8a9下标法元素引用元素地址相邻元素的地址偏移量为115int a 10 ;二、一维数组元素的引用指针法aa+1a+3a+2a+6a+5a+4a+9a+8a+7a0a1a2a3a4a5a6a7a8a9下标法指针法*a*(a+1)*(a+2)*(a+3)*(a+4)*(a+5)*(a+6)*(a+7)*(a+8)*(a+9)元素引用地址2&a0&a1&a2&a3&a4&a5&a6&a7&a8&a9地址1元素地址ai与*(a+i)等价16*(p+i)三、指向一维数组元素的指针变

8、量 指向数组元素的指针变量的定义: 类型名 * 指针变量名例:int a10;int *p;p=a; 或p=&a0;pp+iint a 10 ;a,&a0a+i, &aia0,*aai,*(a+i)*p或 int a10, *p=a;或 int a10, *p=&a0;指针位移运算 p+i: 指针变量p位移 i个元素*(p+i)与pi等价,p0,pi176.2.2 指针变量的运算pp+5int a 10 ;a,&a0a+5, &a5a0,*aa5,*(a+ 5)指针比较运算 p2p:地址值大小比较。本例值为 1(真)指针相减运算 p2-p:计算p2与p相距的元素个数。本例值为5注意:只有对数组

9、指针变量进行位移、相减和比较运算才有意义; 指针相加运算无意义。指针位移运算 p+i:指针变量p位移 i个元素p2,18(1)指针变量的值可以改变,即可以使用p+、p+=2、p-=3等, 作用是相对于当前位置前移或后移若干个存储单元。 数组名本身表示数组的首地址,是常量而不是变量,故不能对数组名进行自增自减或赋值运算。(2)注意下面几种运算: *p+与*(p+)等价 (*与+同优先等级,右结合性) *(p+)与*(+p)不等价 (前者先访问p所指单元再移p到下一单元,后者先移p到下一单元再访问) (*p)+与*(p+)不等价 (前者是被访问单元值加1,后者是指针值加1)有关一维数组及其指针变量

10、在使用时的注意事项19一维数组元素输入和输出#include void main( ) int a10,i; for ( i=0; i10; i+) scanf(%d, &ai); printf(n); for ( i=0; i10; i+) printf(%5d, ai); printf(n); 方法一:下标法1#include void main( ) int a10,*p=a,i; for ( i=0; i10; i+) scanf(%d, &pi); printf(n); for ( i=0; i10; i+) printf(%5d, pi); printf(n); 下标法2p=a后,

11、p可以当作数组名使用20一维数组元素输入和输出#include void main( ) int a10,i; for ( i=0; i10; i+) scanf(%d, a+i); printf(n); for ( i=0; i10; i+) printf(%5d, *(a+i); printf(n); 方法二:首地址偏移量法1#include void main( ) int a10,*p=a,i; for ( i=0; i10; i+) scanf(%d, p+i); printf(n); for ( i=0; i10; i+) printf(%5d, *(p+i); printf(n)

12、; 首地址偏移量法221一维数组元素输入和输出#include void main( ) int a10,*p=a; for ( ; pa+10; p+) scanf(%d, p); printf(n); for ( p=a; pp1) pmax=p; pnmax=p+1; else pmax=p+1; pnmax=p; for (i=2;i10;i+) if (*pmaxpi) pnmax=pmax; pmax=p+i; else if (*pnmaxpi) pnmax=p+i; printf(max=%d,nmax=%dn,*pmax,*pnmax);习题6.2 用指针方法求数组元素中的最

13、大值与次最大值 236.2.3 指向二维数组的指针一、二维数组的地址int a 34;aa00 a01 a02 a03a10 a11 a12 a13a20 a21 a22 a23逻辑结构a00a01a02a03a10a11a12a13a20a21a22a23存储结构二维数组的物理结构:在内存中占用连续的存储单元,数组名为首地址a+1指向何方?24可以将二维数组的每一行看作一个一维数组第0行a00 a01 a02 a03 =a0第1行a10 a11 a12 a13 =a1第2行a20 a21 a22 a23 =a2(一)二维数组的行地址aa+1a+2行地址将二维数组a看作一个特殊的一维数组,由3

14、个特殊元素组成,每个特殊元素分别为一个大小为4的一维数组,数组名分别为a0、a1和a2注意: 二维数组的数组名a是行地址; a+i是指向第 i 行。25 a10a11a12a13(二)二维数组的元素地址 第1行是数组名为a1的一维数组a1a1+1a1+2a1+3注意:ai是第 i 行首元素的地址,不是元素的引用!元素地址第0行a00 a01 a02 a03 =a0第1行a10 a11 a12 a13 =a1第2行a20 a21 a22 a23 =a226a00a02a12a13a03a23a20a11a21a22a10a01二维数组的元素地址 元素 aij 地址的几种表示形式: &aij (取

15、地址运算) a0+4*i+j (从数组首元素地址算起) ai+j (从行首元素地址算起) *(a+i)+j (从首行地址算起) a0a0+4或a1a0+8或a2a0+1a0+6或a1+2a0+11或a2+3a0为首元素地址27例6.10 确定数组每个成分的大小。#include void main()int a34=0,1,2,3,4,5,6,7,8,9,10,11; printf (The size of a=%un,sizeof(a); printf(The size of a0=%un,sizeof(a0); printf(The size of a00=%un,sizeof(a00 )

16、;程序运行的结果:The size of a24The size of a08The size of a002可见,a表示整个数组;a0表示数组的一行;a00仅表示一个元素。28二、指向二维数组元素的指针变量指向数组元素的指针变量的定义: 类型名 *指针变量名如果有:int a34,*p;p=&a00; 或 p=a0;则指针变量p指向了数组元素a00,于是,*p等价于a00。注意:指向数组元素的指针变量的一个偏移量是指针移动一个元素,即指针变量的值加1,则指向下一个元素。p=a; 可以吗?TC+3.0不允许!TC2.0允许,但概念不清!29举例 输出二维数组中的全部元素用元素指针处理#incl

17、ude void main( ) int a34=1,3,5,7,9,11,13,15,17,19,21,23; int *p; for(p=a0; pa0+12; p+) if(p-a0%4=0) printf(n); printf(%4d,*p); 例6.12 指针移动法30举例 输出二维数组中的全部元素用元素指针处理#include void main( ) int a34=1,3,5,7,9,11,13,15,17,19,21,23; int *p,i; p=a0; for (i=0;i12;i+) if (i%4=0) printf(n); printf(%4d,*(p+i); 另解

18、:首地址偏移量法for (i=0;i3;i+) printf(n); for (j=0;j4;j+) printf(%4d,*(p+i*4+j); 或:31三、指向行数组的指针变量行指针变量的定义: 类型名 (*行指针变量名)N说明:定义行指针变量存放行地址,指向指定类型、列数为N的二维数组的行。例如:int a34 , (*p)4 ; p=a;则:行指针变量p指向了整型、具有4个列的二维数组a的首行。注意:行指针p的大小必须和二维数组a的列数一致; 行指针p+i,表示使行指针从当前位置开始,向下移动i个偏移量,每个偏移量为一行。32举例 输出二维数组中的全部元素用行指针处理#include

19、void main()int a34=1,3,5,7,9,11,13,15,17,19,21,23; int (*p)4=a,i,j; for (i=0;i3;i+) printf(n); for (j=0;j4;j+) printf(%4d,*(*(p+i)+j); P165例6.12另解行指针p被赋予a后,p可以当作二维数组名使用或pij336.3 字符串与指针一、字符串和字符串结束标志 字符串常量: 两个双引号之间的字符序列叫做字符串常量,如abcdefg。字符串结束标志:系统自动为每一个字符串常量加一个字符串结束标志0,在内存中也占一个字节。 (注:0的ASCII值为0)字符串常量的存

20、储长度:字符串中有效字符的个数加1。系统将字符串常量按一维字符数组处理。34字符常量和字符串常量的区别字符常量字符串常量形式用单引号括起来用双引号括起来字符数量1个字符大于等于一个字符举例a、2、*abcdea35二、字符数组和指向字符串的指针变量(6.3.26.3.4 ) C语言没有字符串变量,可以通过以下两种方法实现对字符串的处理字符数组字符指针变量36(一)字符串的定义字符数组字符指针变量定义不初始化例:char str14; 定义一个字符型一维数组,占用4个连续的字符型存储单元,其首地址为数组名str1例:char *str2; 定义一个字符型指针变量,占用1个指针型存储单元但无值,因

21、为字符型存储单元未分配,指针变量str2无明确指向str1是常量str2是变量初始化例:char str1=abc; 定义一个字符型一维数组,占用4个连续的字符型存储单元存放abc,其首地址为数组名str1例:char *str2=abc; 定义一个字符型指针变量,占用1个指针型存储单元,另分配4个连续的字符型存储单元存放abc,其首地址存放在指针变量str2中37(二)字符串的赋值(=)字符数组例:char str14;字符指针变量例:char *str2;赋值整体赋值str1=def;不合法! 不允许对数组名赋值,因为数组名是常量! 可使用strcpy函数对字符数组整体赋值 str2=de

22、f;合法! 允许对字符型指针变量赋字符串,作用是分配4个连续的字符型存储单元,其首地址存放在指针变量str2中逐个字符赋值例:str10=d; str11=e; str12=f; str13=0;例:*str2=d; *(str2+1)=e; *(str2+2)=f; *(str2+3)=0;前提:字符指针已有明确的指向38(三)字符串的输入字符数组例:char str4; 字符指针变量 前提:字符指针有明确的指向例:char c4,*str=c;例:char *str=abc;输入整体输入方法1)用scanf函数: scanf(%s, str); 注意:所输入的字符串以空格或回车键结束,故不

23、能输入含有空格的串。方法2)用gets函数: gets(str); 注意:所输入的字符串以回车键结束,串中可以包含空格。逐个字符输入(不提倡使用)例:for(i=0; (stri=getchar()!=n; i+); stri=0; /*将n改为0 */例6.14( P168 )39字符串输入举例aabb0?char c10; scanf(%s, c);如果从键盘上输入:aabbccgets(c);aabbcc0?如果从键盘上输入:aabbccgets函数格式:gets(串地址)功能:从键盘上输入一个字符串到指定地址开始的存储空间中。 (P174)对s,回车或空格是输入结束符,并自动转换成0存

24、储对gets,回车是输入结束符,并自动转换成0存储40(四)字符串的输出字符数组例:char str4 =abc;字符指针变量例:char c4,*str=c;例:char *str=abc;输出整体输出方法1)用printf函数: printf(%sn, str); 注意:遇0结束输出 (0不输出) 。方法2)用puts函数: puts(str); 注意:遇0结束输出并将0作为回车换行(n)输出。逐个字符输出(不提倡使用)例:for(i=0; stri!=0; i+) printf(%c, stri);例:for(p=str; *p!=0; p+) /* char *p; */ putcha

25、r(*p); 或 stri或 *p不常用这类方式输出字符串,但常用这类方式控制字符的逐一处理。41puts( )函数使用举例abcd?#include void main( ) char c10 ; int i ; for( i=0 ; i4 ; i+ ) ci=a+i ; puts( c ) ; ci= 0;abcd0?abcd随机字符abcd(输出后换行)c:puts函数格式:puts(字符串)功能:输出指定的字符串,并自动将0转换为回车换行 (n)输出。 (P175)42 字符串输出:puts(串) 字符串输入:gets(串地址) 串2复制到串1:strcpy(串1地址,串2) 串1串2

26、大小比较:strcmp(串1,串2) 串2连接到串1:strcat(串1地址,串2) 求串的实际长度:strlen(串) 串大小写转换:strlwr(串) ,strupr(串) #include stdio.h#include string.h二、字符串处理函数 (6.3.5 +6.3.6)串常量或串地址43strcpy( )函数字符串复制函数格式: strcpy(串1地址,串2)功能:将字符串2(连同结束标志0)复制到串1地址所指的存储空间中。注意:串1地址所指的存储空间必须已分配且足够大,以便容纳字符串2。44strcpy( )函数应用举例: #include #include void

27、main( ) char a6=China, b=FZ; strcpy(a,b ) ; strcpy(b, 10) ; puts( a ); puts( b); 输出:FZ 10不允许:a=b; b = 10; 45P178例6.21 将字符串s1复制到字符串s2,即实现:strcpy(s2,s1) 下标法 字符指针法 i=0当s1i!=0 s2i=s1i i+ s2i= 0 输出s2 from=s1, to=s2当*from!=0 *to=*from to+, from+ *to= 0 输出s2编程实现strcpy( )功能46#include void main ( ) char s1 =

28、Hello,World!,s215; char *from=s1,*to=s2; while(*from) /*代表while(*from!=0)*/ *to=*from; to+; from+; *to=0; puts(s1); puts(s2); 例6.21 实现strcpy(s2,s1) 字符指针法:47 while(*from) *to=*from; to+; from+; *to=0;简化 while(*from) *to+=*from+; *to=0;例6.21的以下程序段可简化: 简化 while( (*to+=*from+)!=0 ) ;48strcat( )函数字符串连接函数

29、格式: strcat(串1地址,串2)功能:将字符串2(连同结束标志0)接到字符串1的后面(0位置开始) 。例:#include #include void main( ) char c120=abcde, *c2=12345; strcat( c1 , c2 ) ; puts( c1 ); 输出: abcde12345注意:串1地址所指的存储空间必须已分配且足够大,以便容纳连接后的新字符串。49P179例6.23 将字符串s2连接到字符串s1的后面,即实现:strcat(s1,s2) 下标法 字符指针法 i=0 当s1i!= 0 i+ j=0当s2j!= 0 s1i+=s2j+ s1i= 0

30、 输出s1 p1=s1 当*p1!= 0 p1+ p2=s2当*p2!= 0 *p1+=*p2+ *p1= 0 输出s1编程实现strcat( )功能50strcmp( )函数字符串比较函数格式:strcmp(串1,串2)功能:比较字符串1和字符串2的大小比较方式:逐个字符比较;按ASCII码比较;遇到第一对不同的字符或者有一个字符串结束停止。返回值:返回两个字符串中第一对不同字符的ASCII码值之差。 若返回值等于0,表示串1等于串2; 若返回值大于0,表示串1大于串2; 若返回值小于0,表示串1小于串2。 51strcmp(abcde,ad ) b-d= -2strcmp(abcde,ad

31、 )=-2 abcde小于adad0abcde0strcmp(abcde,ab ) c-0= 99strcmp(abcde,ab )=99 abcde大于abab0abcde0strcmp(ab,ab ) 0-0=0strcmp(ab,ab )=0两串相等ab0ab0strcmp( )函数比较过程52#include void main ( )char s180,s280,*str1=s1,*str2=s2; int i,d=0; printf(Input string s1 and s2 :n); gets(str1); gets(str2); while (*str1 & *str2) /

32、* str1、str2均未到0 */ d=*str1-*str2; if (d!=0) break; /*对应字符不等,结束比较*/ str1+, str2+; if (d=0) /*前一对字符相等,本对字符中至少一个是0 */ d= *str1-*str2; printf(%dn,d); 编程实现strcmp( )功能P178例6.22 利用字符指针比较字符串s1和s2的大小,即实现strcmp(s1,s2)53#include void main ( )char s180,s280,*str1=s1,*str2=s2; int i,d; printf(Input string s1 and

33、 s2 :n); gets(str1); gets(str2); while (*str1 = *str2 & *str1) str1+, str2+; d= *str1-*str2; printf(%dn,d); 例6.22算法改进编程实现strcmp( )功能/* 当对应字符相等且 均未到0 ,继续 比较下一对字符 */54strlen( )函数求字符串实际长度函数格式: strlen(字符串)功能: 求字符串的实际长度,不包括0。返回值:返回整型数据,其大小为字符串中有效字符的个数。#include #include void main ( ) char a10=12345 ; char

34、 *b=123045; char *c=123085; char d5=12345; char *e=12345; printf(%dn%dn%dn%dn%dn,strlen(a), strlen(b),strlen(c),strlen(d),strlen(e); 输出:6 43(不确定数)5045是转义字符!55#include void main ( ) char s180,*str1=s1; int len=0; gets(str1); while(*str1!=0) len+; str1+; printf(len=%dn, len); 编程实现strlen( )功能56strlwr(

35、)函数转换生成小写字母串格式: strlwr(字符串)功能: 将字符串中的大写字母转换成小写字母,其它字符不变strupr( )函数转换生成大写字母串格式: strupr(字符串)功能: 将字符串中的小写字母转换大写字母,其它字符不变57#include void main ( ) char s1 =BeiJing2008, *str1; str1=s1; while(*str1!=0) if (*str1=A) & (*str1=Z) *str1+=32; str1+; puts(s1); P180例6.24(1)实现:strlwr(s1) 编程实现strlwr( )功能58三、字符串应用举

36、例 字符串复制(不用strcpy函数) 字符串连接(不用strcat函数) 字符串比较(不用strcmp函数) 求字符串实际长度 转换生成小写字母串(不用strlwr函数)- 将字符串反向 删除串中空格 将数字串转换为整型数 将正整数转换为数字串 将十进制正整数转换为十六进制数 字符串加密59#include void main ( ) char str50, *p1, *p2, temp; printf(Enter string:); gets(str); p1 = p2 = str; while ( *p1 ) p1+; /* 找到串结束标记0 */ p1-; /* 指针p1指向串中的最后

37、一个字符 */ while ( p2p1 ) temp = *p2; /* 交换两个指针所指向的字符 */ *p2+ = *p1; /* p2向串尾方向移一位 */ *p1- = temp; /* p1向串首方向移一位 */ puts(str); 例6.27 举例 将字符串反向60举例 删除一个字符串中所有的空格字符例6.25输入字符串sp1=s, p2=s当*p1!=0真 假p1+*p2=*p1 p1+, p2+*p2=0输出 sp1依次指向删空格前的s串的各个字符 p2依次指向接收非字符的各个位置*p1为空格 61#include void main ( ) char s8,*p=s; l

38、ong int n=0; int d; gets(s); while(*p) d=*p-0; n=n*10+d; p+; printf(%ldn,n); 例6.26 如: 1234 1234思路:1234 1 1 n=11234 2 2 n=n*10+2=121234 3 3 n=n*10+3=1231234 4 4 n=n*10+4=1234-|-|- *p d=*p-0 n=n*10+d举例 将数字串转换为整型数将数字字符转换为数字值,或*p-48 62如: 1234 1234思路:a=1234 4 4 s=4a=123 3 3 s=43a=12 2 2 s=432a=1 1 1 s=43

39、21|-|-|-a b *p= = =a/10 a%10 b+0举例 将正整数转换为数字串将数字字符转换为数字值,或*p-48 #include #include void main()long a; char s8,*p=s; int b,i; scanf(%ld,&a); while (a0) b=a%10; *p=0+b; a=a/10; p+; *p=0; 将s串反向存放后输出 或直接反序输出 63如: 1234 4D2思路:a=1234 b=a%16=2 2 s=2a=a/16=77 b=a%16=13 D s=2Da=a/16=4 b=a%16=4 4 s=2D4|-|-|-a b

40、 *p= = =a/16 a%16 b+0(b9)举例 将十进制正整数转换为十六进制数 09之间的数转换为十六进制数码0 91015之间的数转换为十六进制数码A F64举例 字符串加密密码转换规律: 假设k=4,将字母A变成字母E,字母a变成e,即变成其后的第四个字母,字母W变成A,X变成B,Y变成C,Z变成D。非字母不变。A65MGRDV 86B66C6769 E 70 FIJKLNOPQSTUW 87X 88YZ90H习题4.28 先输入数字k(0k10),再将输入的一行字符中的英文字母转换为其后续的第k个字母输出,字母超出最后一个“Z”或“z”时,循环转换,数字不转换。 65getcha

41、r()用来“吃掉”跟在k值后输入的回车键字符串加密程序#include void main( ) char s80,*p=s; int k; printf(input k: ); scanf(%d,&k); printf(input string: ); getchar(); gets(s); puts(s); while ( *p!= 0 ) p+; if ( *p=A&*p=a&*pZ&*pz&*p=z+k ) *p=*p-26; 习题4.28运行举例:input k: 3input string: Agte%f32xz7YDjwh%i32ac7B 66补遗:字符数组的初始化举例 char

42、 a5 = 1234 char b35 = 1234 , ABCD , abcd ;或:char a5 = 1234 char b35 = 1234 ,ABCD ,abcd ; char b35 = 1,2,3,4,0 ,A,B,C,D,0 , a,b,c,d,0 ;以下不提倡使用: char a5 = 1,2,3,4,0 char b35 = 1,2,3,4,0,A,B,C,D,0, a,b,c,d ,0 ;以上各数组的第一维大小均可省!676.4 指针数组和指向指针的指针一个数组,如果其中的各个元素均为指针类型,则这个数组称为指针数组。如果一个指针变量指向指针类型的数据,则这个指针变量称为

43、指向指针的指针。主要应用在字符串处理上 68一、指针数组的概念指针数组的定义:类型名 *数组名常量表达式;如: int *p4;表示数组p是一个具有4个元素的一维数组,每个数组元素都是一个指向整型数据的指针,即每个元素都是一个整型变量的地址。 注意区别: int (*p)4; 行指针 int *p4; 指针数组69例6.29 通过指针数组元素访问int型二维数组的元素。#include void main() int a34=0,1,2,3,4,5,6,7,8,9,3,6; int *pa3; int i,j; for (i=0;i3;i+) pai=ai; for (i=0;i3;i+) f

44、or(j=0;j4;j+) printf(a%d%d=%d ,i,j,*(pai+j); /* *(pai+j) 与*(ai+j)、*(*(a+i)+j)、aij均等效*/ printf(n); 指针数组的元素只能存放地址!指向首元素70二、字符指针数组与二维字符数组应用比较二维字符数组定义char s68=FORTRAN,PASCAL,BASIC,COBOL,C,C+ ; 字符指针数组定义char *ps6=FORTRAN,PASCAL,BASIC,COBOL,C,C+ ; 结论一:处理不等长字符串时,字符指针数组比二维字符数组节省存储空间。二维字符数组s每行存放一个字符串,按最长串的长度为

45、各串分配存储空间指针数组ps每个元素存放一个字符串的首地址,按各串实际长度分配存储空间指向首字符71举例:将若干个字符串按升序输出 char temp8; int i,j,k; for(i=0;i5;i+) /*选择排序法*/ k=i; for(j=i+1;j0) k=j; if (k!=i) strcpy(temp,sk); srrcpy(sk, si); strcpy(si,temp); 排序后的字符数组解1)例6.28用二维字符数组核心程序段:交换sk与si所存放的字符串,实质上是逐个字符交换72将若干个字符串按升序输出 char *temp; int i,j,k; for(i=0;in-1;i+) /*选择排序法*/ k=i; for(j=i+1;j0) k=j; if (k!=i) temp=psk; psk=psi; psi=temp; 结论二:用指针数组指向若干个字符串,使字符串处理更加方便灵活。解2)例6.31用指针数组核心程序段:排序后的指针数组交换psk与psi的指向,比交换字符串节省时间73三、二级指针(指向指针的指针)二级指针的定义:类型名 *变量名;如: int a, *p

温馨提示

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

评论

0/150

提交评论