版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C语言及程序设计(强)
(00814024)指针与字符串指针
——指针概念指针基本概念变量信息:值和地址指针:地址指针变量:值为地址的变量指针变量定义:变量名前带*int*p;p是一个变量,为指针变量p的值是一个int类型变量的地址取址运算符(&):对一般变量取其地址取值运算符(*):对指针变量取地址所存数据指针使用举例intn,m;int*p;scanf("%d",&n);p=&n;m=*p;printf("%d\n",m);m=n;指针
——指针与数组指针与一维数组inta[]={10,11,12,13,14};int*p;p=&a[0];变量访问的等价性n=a[2];a[2]+=n;n=*(p+2);*(p+2)+=n;n←12a[2]←24数组名作为指针常量a指向a[0],a+2指向a[2]*a即a[0],*(a+2)即a[2]p+2与a+2*(p+2)与*(a+2)数组与指针的共同点通过基地址+偏移量方式访问元素数组方式:数组名+下标指针方式:首地址+偏移数组名作为指针常量,inta[10];元素:
a[i]等同于*(a+i)首地址:&a[i]等同于a+i指针作为数组名,int*p;指向数组的第一个元素=指向整个数组元素:*(p+i)等同于p[i]首地址:p+i
等同于&p[i]指针
——指针与函数指针的交换交换指针int*p,*q,*t;t=p;p=q;q=t;交换指针所指数据int*p,*q,t;t=*p;*p=*q;*q=t;编写函数,交换两数#include<stdio.h>voidswap(int*p,int*q){
intt;t=*p;*p=*q;*q=t;}main(){
intx,y;
scanf("%d%d",&x,&y);swap(&x,&y);
printf("x=%d,y=%d\n",x,y);}调用swap函数的内存结构图指针
——指针应用find函数:查找并返回下标/下标法intfind(inta[],intn,intx){
inti;for(i=0;i<n;i++)if(a[i]==x)returni;return-1;}pfind函数:查找并返回指针/下标法int*pfind(inta[],intn,intx){
inti;for(i=0;i<n;i++)if(a[i]==x)return
&a[i];return
NULL;}pfind函数:查找并返回指针/指针法int*pfind(inta[],intn,intx){
int
*p;for(p=a;p<a+n;p++)if(*p==x)returnp;returnNULL;}指针
——动态内存动态内存分配与释放动态内存分配函数void*malloc(unsignedsize);内存释放函数voidfree(void*buffer);分配与释放n个整数的空间int*p;p=(int*)malloc(n*sizeof(int)); /*分配*/…… /*使用该分配空间*/free(p); /*释放*/输入n和n个整数…main(){
int
*a,n,i;
scanf(“%d”,&n);a=(int*)malloc(n*sizeof(int));for(i=0;i<n;i++)
scanf(“%d”,&a[i]);……/*指针a可作为数组名使用*/……
free(a);}指针(扩展)
——特殊指针指针数组多个指针组成的数组,如char*pa[10];或如图初始化二级指针char**p2;p2=pa;或p2=&pa[0];第i个姓名:names[i]或pa[i]或p2[i]或*(p2+i)第i个姓名的第j个字符
names[i][j]或pa[i][j]或p2[i][j]
或*(pa[i]+j)或*(*(p2+i)+j)函数指针指向函数的指针返回类型(*指针变量名)(函数形参表);如:double(*pfunc)(double);函数指针指向函数有库函数:doublesin(double);如:pfunc=sin;通过指针调用函数如:y=(*pfunc)(x);等价于y=sin(x);函数指针数组如:double(*pfs[3])(double);命令行参数main(int
argc,char*argv[])或main(int
argc,char**argv)如程序命令:07ARGcomputerlanguage数组
——字符串字符串字符串常量字符串表示——数组法字符串输出字符串输入常用字符串函数程序举例字符串常量使用双引号:"Hello"连续的字符序列'H','e','l','l','o','\0'字符尾部追加'\0'字符字符串的实质是指针字符串在内存的首地址区分"A"和'A'Hello\0地址值0x3000'H'0x3001'e'0x3002'l'0x3003'l'0x3004'o'0x3005'\0'…地址为假设数组表示charstr[8]="Hello";字符数组str有8个元素前5个为字符H、e、l、l、o第6个为字符串结束符\0后2个为二进制0字符串长度等于'\0'所在下标地址值变量0x2000'H'str[0]0x2001'e'str[1]0x2002'l'str[2]0x2003'l'str[3]0x2004'o'str[4]0x2005'\0'str[5]0x20060str[6]0x20070str[7]str字符串输入输出函数charstr[80];
char*p;输出函数puts(str); 等价于printf("%s\n",str);puts(p); 等价于printf("%s\n",p);输入函数gets(str); 相当于scanf("%s",str);gets(p); 相当于scanf("%s",p);gets输入一行,以回车结束scanf("%s",…)输入一个单词以空格、TAB和回车结束#include<stdio.h>字符串输出数组法charstr[]="Hello,world!";printf("%s\n",str);或puts(str);字符串输入数组法charstr[80];scanf("%s",str);或gets(str);字符串输入时必须先用数组法开好空间字符串常用函数(1)#include<string.h>计算并返回字符串长度函数声明:int
strlen(char*p);函数声明:int
strlen(char
str[]);区别strlen
与sizeof/计算存贮空间charstr[80]="Hello";strlen(str)为5,strlen("Hello")为5sizeof(str)为80,sizeof("Hello")为6下标[0][1][2][3][4][5][6]…[79]strHello\0???字符串的循环处理按长度循环charstr[80];gets(str);n=strlen(str);for(i=0;i<n;i++)
putchar(str[i]);putchar('\n');按结束标志循环\0所在下标即为字符串长度charstr[80];gets(str);for(i=0;str[i]!='\0';i++)
putchar(str[i]);printf("\n");下标[0][1][2][3][4][5][6]…[79]strHello\0???字符类函数(扩展)#include<ctype.h>库函数判断字母:isupper,islower,isalpha判断数字:isdigit,isalnum转换大小写:toupper,tolower设charc;if(islower(c))等价if(c>='a'&&c<='z')c=toupper(c)等价if(c>='a'&&c<='z')c=c-'a'+'A';输入一行字符串,小写转换为大写,再输出#include<stdio.h>main(){chara[80];inti;
gets(a);for(i=0;a[i]!='\0';i++)
/*i<strlen(a)*/if(a[i]>='a'&&a[i]<='z')/*islower(a[i])*/
a[i]=a[i]-'a'+'A';/*a[i]=toupper(a[i])*/
puts(a);}筛选小写字符并生成字符串int
i,n;charstr[80];gets(str);n=strlen(str);for(i=0;i<n;i++)if(islower(str[i]))
putchar(str[i]);putchar('\n');chara[80],b[80];int
i,k,n;gets(a);n=strlen(a);k=0;for(i=0;i<n;i++)if(islower(a[i]))
b[k++]=a[i];b[k]='\0';puts(b);字符串常用函数(2)#include<string.h>字符串复制(将字符串s2复制到s1中)函数声明:char*strcpy(char*s1,char*s2);函数声明:char*strcpy(chars1[],chars2[]);例如:charstr[80];strcpy(str,"Hello");下标[0][1][2][3][4][5][6]…[79]原str?????????新strHello\0???字符串常用函数(3)#include<string.h>字符串连接(将字符串s2拼接到s1后)函数声明:char*strcat(char*s1,char*s2);函数声明:char*strcat(chars1[],chars2[]);例如:charstr[80]="He";strcat(str,"llo");下标[0][1][2][3][4][5][6]…[79]原strHe\0??????新strHello\0???字符串常用函数(4)#include<string.h>字符串比较(字典顺序,s1在后则>0)函数声明:int
strcmp(char*s1,char*s2);函数声明:int
strcmp(chars1[],chars2[]);例如:chara[80]="A123",b[50]="A4";则strcmp(a,b)<0为真下标[0][1][2][3][4][5]…[49]…[79]aA123\0?????bA4\0?????字符串与整型数使用比较intm,n;scanf("%d",&m);printf("%d",m);m=5;n=m;if(m<n)m++;m+=n;chara[80],b[80];scanf("%s",a);或gets(a);printf("%s",a);或puts(a);strcpy(a,"Hello");strcpy(b,a);if(strcmp(a,b)<0)n=strlen(a);strcat(b,a);例输入一行字符串,将字符串的所有字符后移5个字符后输出,最后的5个字符移到头部如输入:Ab12,#$xyzWQ则输出:xyzWQAb12,#$输入部分chara[80];intn;gets(a);n=strlen(a);n为字符个数,同时n下标对应\0结束符如输入:Ab12,#$xyzWQ012345…n-5n-4n-3n-2n-1n…aAb12,#$xyzWQ\0?后移5字符
(字符串函数)main(){chara[80],b[80];
int
n,i,k;gets(a);n=strlen(a);strcpy(b,a+n-5);
strcat(b,a);
a[n]='\0';puts(b);}012345…n-5n-4n-3n-2n-1naAb12,#$xyzWQ\0bxyzWQAb12,#$\0后移5字符(分段输出法)main(){chara[80];intn,i;gets(a);n=strlen(a);for(i=n-5;i<=n-1;i++)
putchar(a[i]);
for(i=0;i<n-5;i++)
putchar(a[i]);
putchar('\n');}012345…n-5n-4n-3n-2n-1naAb12,#$xyzWQ\0后移5字符(分段生成法)main(){chara[80],b[80];
int
n,i,k;gets(a);n=strlen(a);…………puts(b);}k=0;for(i=n-5;i<=n-1;i++)
b[k++]=a[i];for(i=0;i<n-5;i++)
b[k++]=a[i];b[k]='\0';012345…n-5n-4n-3n-2n-1naAb12,#$xyzWQ\0bxyzWQAb12,#$\0后移5字符(下标计算法)main(){chara[81],b[81];int
n,i;gets(a);n=strlen(a);…………puts(b);}for(i=0;i<=n-1;i++)b[(i+5)%n]=a[i];b[n]='\0';推导公式:
i→(i+5)%n0→5,1→6,2→7n-7→n-2,n-6→n-1n-5→0,n-4→1,n-3→2n-2→3,n-1→401234n-7n-6n-5n-4n-3n-2n-1naAb12,#$xyzWQ\0bxyzWQAb12,#$\0其它字符串函数(扩展)字符串比较,不区分大小写int
stricmp(chars1[],chars2[]);字符串所有小写转换为大写char*strupr(chars[]);字符串所有大写转换为小写char*strlwr(chars[]);库函数的实现代码例,字符串小写转大写char*my_strupr(chars[
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年度租赁合同:设备租赁与技术支持
- 林木育种在改良土地肥力中的应用考核试卷
- 04版不锈钢工程环境保护合同
- 合成材料制造中的质量控制考核试卷
- 2024年度软件定制开发合同including系统测试与升级服务
- 学前教育的认知发展理论考核试卷
- 技术创新与应用的培训经验分享与探讨考核试卷
- 2024年度货物买卖合同的支付方式及时间
- 2024年度劳动合同:某公司与员工签订三年期劳动合同
- 2024年度知识产权保护与授权合同
- 医院药房人员培训课件
- 2024年度Logo设计及品牌形象重塑合同
- 中小学学校国家智慧教育云平台应用项目实施方案
- 2024-2030年中国干细胞医疗行业趋势分析及投资战略研究报告
- 2024-2030年铝型材行业市场深度调研及前景趋势与投资战略研究报告
- 2024-2030年辣椒种植行业市场深度分析及发展策略研究报告
- 通信工程施工方案
- 初中英语研修方案
- 化工厂拆除施工方案
- 海南自贸港优化营商环境条例7大亮点解读课件
- 中国邮政储蓄银行2024年下半年社会招聘高频难、易错点500题模拟试题附带答案详解
评论
0/150
提交评论