版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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年峨眉山市人民医院高层次卫技人才招聘笔试历年参考题库频考点附带答案
- 城南旧事读书心得七年级作文800字【7篇】
- 2024年甲肝疫苗项目可行性研究报告
- 北京市房屋租赁合同自行成交版租房
- 老员工辞职申请书15篇
- 石材打磨结晶面护理合同
- 煤炭个人购销合同
- 2024年中国砂椎开瓶器市场调查研究报告
- 2025版空房租赁与绿色建筑节能评估服务合同3篇
- 个人装修合同简易版本
- 政治-2025年八省适应性联考模拟演练考试暨2025年四川省新高考教研联盟高三年级统一监测试题和答案
- 2024年中国医药研发蓝皮书
- 德邦物流人力资源管理规划项目诊疗
- 基于西门子S7-200型PLC的消防给水泵控制系统设计
- 仪器设备采购流程图
- 盈利能力分析外文翻译
- 不合格医疗器械报损清单
- 高中物理全套培优讲义
- 新一代反洗钱监测分析系统操作手册all
- 矿山环境保护ppt课件(完整版)
- 档案保护技术概论期末复习资料教材
评论
0/150
提交评论