《数组的指针和字符串的指针.ppt》由会员分享,可在线阅读,更多相关《数组的指针和字符串的指针.ppt(32页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、一、数组的指针1.数组与地址2.数组元素的访问二、字符串指针1.字符串指针的定义2.字符指针与字符数组的区别三、指针作为函数参数1.数组名作为函数参数2.字符指针作为函数参数第16讲 数组的指针和字符串的指针C 语言规定:数组名代表数组(元素)的首地址,即第一个元素的地址。若有:inta10,*p=a;则:a与a0 是等价的指针变量p 为数组的指针 数组的指针:数组的起始地址,即数组元素的首地址。数组元素的指针:数组元素的地址。一、数组的指针1.数组与地址 对数组的首地址加上偏移量x就可以得到其它元素的地址。例:a1 表示数组元素a1 的地址等价于a+1、p+1ax 表示数组元素ax 的地址等
2、价于a+x、p+x2.数组元素的访问 下标法:用ai 的形式存取数组元素。地址法:用*(a+i)的形式存取数组元素。指针法:用指针变量p 指向数组的首地址,然后通过移动指针存取数组元素。如p=a,p+i。例a用下标法存取数组元素main()inta10,i;for(i=0;i10;i+)scanf(%d,&ai);for(i=0;i10;i+)printf(%d,ai);printf(n);例b用地址法存取数组元素main()inta10,i;for(i=0;i10;i+)scanf(%d,a+i);for(i=0;i10;i+)printf(%d,*(a+i);printf(n);数组元素的
3、访问举例例c用指针法存取数组元素。(即通过指针指向数组的首地址,然后通过移动指针存取数组元素。)main()inta10,*p,i;for(i=0,p=a;i10;i+)scanf(%d,p+i);for(i=0,p=a;i10;i+)printf(%d,*(p+i);printf(n);main()inta10,*p;for(p=a;pa+10;p+)scanf(%d,p);for(p=a;pa+10;p+)printf(%d,*p);printf(n);例c 说明200020012002200320042005200620072008200902468p=&a*p+0462*pp+等价于8
4、数组元素的访问小结:inti,a10,*p=a;表现形式 含义&a0 a p一维数组首地址&a i a+i p+i 一维数组下标为i 的元素地址a0*a*p 一维数组下标为0的元素的值a i*(a+i)*(p+i)一维数组下标为i 的元素的值注意:数组名是一个常量,不允许重新赋值。指针变量是一个变量,可以重新赋值。p+i 和a+i 均表示数组元素ai 的地址,均指向ai。*(p+i)和*(a+i)均表示p+i 和a+i 所指对象的内容,即ai。*p+:等价于*(p+)。其作用:先得到*p,再使p=p+1。(*p)+:表示将p 所指向的变量(元素)的值加1。即等价于ai+。例:inta5=0,2
5、,4,6,8,*p;p=a+2;(*p)+;printf(%dn,*p);程序段输出为:5例main()inta5=0,2,4,6,8,*p,x;p=a;(*p)+;p=a+1;+(*p);p=a+2;(*p)-;p=a+3;-(*p);for(x=0;x=4;x+)printf(%d,ax);printf(n);程序运行结果:13358 指向数组元素的指针也可以表示成数组的形式,即允许指针变量带下标,如*(p+i)可以表示成pi。但需注意,如果p 不指向a0,则pi 和ai 是不一样的。如p=a+3;由于p 指向a3,所以p3 就相当于a6 而不是a3。这种方式容易出错,一般不提倡使用。字符
6、串的处理是用字符型数组来实现的。用char 型数组处理的字符串都可以用char 型指针来处理。通常把char 型指针称为字符串指针或字符指针。二、字符串指针在 程 序 中 定 义 一 个 字 符 指 针 变 量,并 将 字 符 串的 首 地 址 赋 给 它,然 后 通 过 字 符 指 针 变 量 来 访 问字符串。例如:charstr=Cprogramming;char*p;p=str;或:char*str=Cprogramming;1.字符串指针的定义例:/*用字符数组实现字符串操作*/main()charstr=WelcometostudyC!;inti;printf(%sn,str);f
7、or(i=0;i=7;i+)printf(%c,stri);printf(n);程序运行结果为:WelcometostudyC!Welcome例/*用字符指针实现字符串操作*/main()char*str=WelcometostudyC!;inti;printf(%sn,str);for(i=0;i=7;i+)printf(%c,*(str+i);printf(n);字符指针与字符数组的区别 字 符 数 组 是 由 若 干 个 元 素 组 成,每 个 元 素 存 放一 个 字 符;而 字 符 指 针 变 量 存 放 的 是 字 符 串 的首地址。赋 值 方 式 不 同。字 符 数 组 只 能
8、对 各 个 元 素 分 别赋 值,而 字 符 指 针 只 需 赋 给 字 符 串 的 首 地 址 就可以了。字符指针占用的内存要少于字符数组。指 针 变 量 的 值 是 可 以 改 变,而 字 符 数 组 的 数 组名虽然代表地址,但它的值是不会变化。区别举例:如:char*str;str=WelcometostudyC!;以下对字符数组的赋值是错误的:charstr80;str=WelcometostudyC!;例将字符串s1 复制到字符串s2。main()chars1=“copystring”,s230;char*p1=s1,*p2=s2;inti;for(;*p1!=0;p1+,p2+)
9、*p2=*p1;*p2=0;printf(“strings2=”);for(i=0;s2i!=0;i+)printf(“%c”,s2i);printf(“n”);程序运行结果为:strings2=Copystring1.数组名作为函数参数特点:数组名表示数组元素的首地址。在函数调用时,传递的是数组元素的首地址。实参与形参的传递是“值传递”。实参数组与形参数组共用一段存储单元。可以用指向数组的指针变量作函数的参数。三、指针作为函数参数以下列出实参和形参使用数组名或指针变量的四种情况:实参:数组名数组名指针变量指针变量形参:数组名指针变量数组名指针变量例:已知一个一维数组a11 中有10个数,求出
10、其中前n 个数的和,并放入a10 中。其中n 由键盘输入。#includesum(int*q,intn)inti,s=0;int*t;t=q;/*t 与q 都指向数组a的第一个元素*/for(i=0;in;i+,q+)s+=*q;*(t+10)=s;/*t+10 指向数组元素a10*/main()intnum,a11=1,2,3,4,5,6,7,8,9,10;int*p=a;scanf(%d,&num);sum(p,num);printf(%dn,a10);将一个字符串从一个函数传递到另一个函数,可以使用地址传递的方法,即用字符数组名作为参数或用指向字符串的指针变量作为参数。在被调用函数中可以
11、改变字符串的内容,而在主调函数中可以得到被改变了的字符串。由于字符串是按照字符数组形式存储的,所以对字符串中字符的引用也可以用下标法或指针法。2.字符指针作为函数参数例设有两个字符串Hello 和World!,试将它们连接在一起成为一个字符串。main()charstr115=Hello,str2=World!;inti;strcat(str1,str2);printf(Stringstr1=%sn,str1);strcat(char*s,char*t)while(*s!=0)s+;/*使s 指向字符串str1 的末尾*/while(*t!=0)*s=*t;t+;s+;*s=0;/*在s 后加
12、上字符串结束标志*/程序运行结果为:Stringstr1=HelloWorld!例 输入一串小写字符将其转换为大写字符main()inti;chara100;printf(“Inputn”);scanf(“%s”,a);utol(a);printf(%sn,a);utol(char*x)inti;for(i=0;*(x+i)!=0;i+)*(x+i)-=32;例:编写一个函数string_cut(char*str,charc),如果字符串str 中包含字符变量c,则输出其后的字符序列,否则输出空字符。#includestring_cut(char*str,charc)for(;*str!=0&
13、*str!=c;str+);puts(str);voidmain()charstring20=Beijing;charch;scanf(%c,&ch);string_cut(string,ch);例:有3个字符串存放在一维指针数组中,编写一个程序,找出3个串中ASCII 码最大的一个字母并输出。分析:类似于二维数组,在每个字符串中查找最大的字母。#includecharmax(char*s)inti;charch,*p;ch=s00;for(i=0;ich)ch=*p;returnch;voidmain()char*str=“sfawe”,”fghj”,”abcrs”,c;c=max(str);printf(“Max=%cn”,c);程序运行结果为:Max=w