7-指针与数组-字符串2学时_第1页
7-指针与数组-字符串2学时_第2页
7-指针与数组-字符串2学时_第3页
7-指针与数组-字符串2学时_第4页
7-指针与数组-字符串2学时_第5页
已阅读5页,还剩47页未读 继续免费阅读

下载本文档

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

文档简介

1、C语言程序设计,第一讲 基础知识(第1章、第2章) 第二讲 数据类型、运算符和表达式(第3章、第4章、第7章) 第三讲 程序的控制结构(第5章、第6章) 第四讲 数组(第8章) 第五讲 函数(第9章) 第六讲 指针的概念(第11章) 第七讲 指针与数组(第12章、第13章) 第八讲 结构、联合和枚举(第16章) 第九讲 指针的高级应用(第17章) 第十讲 程序结构(第10章) 第十一讲 文件操作(第22章) 第十二讲 预处理与位运算(第14章、第20章),知识回顾-指针与数组,一维数组 数组名是一维数组的首地址 数组名可以作为常量指针访问数组元素 数组名是常量不能对其修改 指针变量可以看成数组

2、名 可以使用下标操作 指针变量未初始化时,不能进行赋值,*(p+i)=ai,知识回顾-指针与数组,二维数组 二维数组的定义 二维数组初始化 一行,全部,双重For循环、指针变量 二维数组存储 按行优先进行存储 二维数组地址 a 为a0 第一行的首地址 a+1 为a1 第二行的首地址 a+2 为a2 第三行的首地址,int m59;,知识回顾-指针与数组,处理二维数组的行 处理二维数组的列 指针数组,for (p = ai; pai+4; p+) *p=0;,int (*p)4,a34; 初始化数组第i列元素 for (p = a; pa+3; p+) (*p)i=0;,类型说明 *数组名数组长

3、度,对复杂指针的理解,指针变量可以指向任何类型的对象: 整型、浮点型、数组、数组元素、结构和函数,结构成员和函数的参数。 声明中包括多种说明符容易造成阅读和理解的困难。 先撇开标识符,按从右到左的顺序逐个解释每个说明符 如果有括号改变解释的先后,先解释括号内再解释扩号外,对复杂指针的理解,int *arrp5;,按下列顺序理解:五个元素的数组、每个元素是一个指针、指针指向整型,所以 arrp 是一个有五个指向整型的指针作为数组元素的数组,是一个指针,指针指向一个包含五个元素的数组,每个元素是一个整型,所以parr 是一个指向五个整型数的数组的指针,int (*arrp)5;,代码改错,#inc

4、lude int main() int i, a5; for(i=1; i=5; i+) ai=i; return 0; ,提示:有两个错误。,(1)没有给数组a的第一个元素a0赋初值; (2)数组越界。,int i, a5;a5=1,3,5,7,9; char ch5;ch5=“good!”; for(i=0; i5; i+) printf(“%d”, ai); printf(“n”); printf(ch);,(1)数组只能在定义时初始化; (2)字符数组越界。,提示:有两个错误。,代码改错,int i, a5; char ch5; for(i=0; i5; i+) scanf(“%d”,

5、 ,提示:有4个错误。,(1)scanf中对整型数组a赋值错误,应为,5.4 字符串,5.4.1 字符串常量 5.4.2 字符串变量 5.4.3 读写字符串 5.4.4 访问字符串中的字符 5.4.5 C语言字符库 5.4.6 字符串惯用法 5.4.7 字符串数组,5.4.1字符串常量,定义:是用一对双引号括起来的字符序列。 字符串常量可以包含转义序列 延续字符串常量,5.4.1字符串常量,存储-字符数组,编译器将字符串常量当作char *类型的指针,字符串的概念表示 (1)作为字符数组:把组成字符串的字符存入内存中连续的字节空间,操作字符串值的程序必须具有某种确定字符串结束的方法; (2)作

6、为指向单个字符的指针: char *p=“abc”; (3)作为抽象类型: typedef char * string; string str; str=“abc”;,5.4.1字符串常量,字符串常量的操作 指针操作 下标操作,5.4.1字符串常量,单字符串常量与字符常量的区别 字符串常量“x是用指针来表示的,表示指向“x的内存单元 而字符常量x是用整数来表示的。,5.4.1字符串常量与字符数组区别,3、3、“3”的区别,5.4.2字符串变量,声明:以空字符结尾的一维数组,初始化变量,5.4.2字符串变量,初始化变量字符长度 小于声明长度 大于声明长度-非法 等于声明长度-不作为字符串使用,i

7、nt main() char ch4 = abc; printf(%sn,ch); return 0; ,5.4.2字符串变量,字符数组与字符指针 法 两者区别 声明为数组,p是数组,可以修改数组中的字符 char p4=“abc”; p1=d; 声明为指针,p是指针变量,不可以修改字符串常量 char *p=“abc”; p2=d;,读scanf 不需要 ch = getchar(); scanf(%c, ,1 _|,键盘的工作原理,为了匹配键盘输入和内存的读写速度,在内存里面建立了缓冲区。 getchar()及scanf函数是从缓冲区中读,而不是从键盘上读。,读gets与scanf不同之处

8、 gets不跳过字符串前的空白字符 gets读到换行符才终止 scanf无法读取整行,gets可以 读gets与scanf相同之处 都在末尾存储一个空字符,5.4.3 字符串的读写,5.4.3 字符串的读写,写printf printf逐个写字符直到遇到空字符,如果空字符丢失,越过字符串的末尾继续读直到在内存的某个地方找到空字符。,%m.ps,m指定宽度,p表示打印字符的数量,5.4.4 设计逐个字符读字符串的函数,设计时要考虑的问题 是否跳过空白字符? 何时终止? 字符串太长无法存储怎么办?, for(i=0; si=ti; i+) if(si=0) return 0; return si-

9、ti; ,作业:字符串排序,至少使用三种不同的方法进行排序,比如选择排序、冒泡排序、快速排序等。 编写程序找出字符串中的元音字母: int FindFirstVowel(char word, int n) int FindFirstVowel(char *word),问题选讲(1),字符串连接(不用库函数strcat)。,#define N 128 #define M 256 int main() char fst_strN, sec_strN; char cat_strM; int i=0, j=0, k=0; gets(fst_str); gets(sec_str);,while(fst_

10、stri!=0) cat_strk = fst_stri; k+; i+; while(sec_strj!=0) cat_strk = sec_strj; k+; j+; cat_strk = 0; puts(cat_str); return 0; ,#define N 128 int main() char fst_strN, sec_strN; gets(fst_str); gets(sec_str); printf(%s%sn, fst_str, sec_str); return 0; ,偷懒的做法1:,问题选讲(2),数据顺序调整(最大数调到数组首元素位置,最小数调到尾元素位置)。,i

11、nt main() int aN; int i, min_idx, max_idx; for(i=0; iN; i+) scanf(%d, ,min_idx = max_idx = 0; for(i=1; iamax_idx) max_idx = i; if (aiamin_idx) min_idx = i; ,/*如果最大数是第一个数,不交换*/ if(max_idx!=0) swap(,for(i=0; iN-1; i+) printf(%d , ai); printf(%dn, ai); return 0; ,1 2 3 4 9 8 7 6 4 3,9 2 3 4 1 8 7 6 4 3

12、,9 2 3 4 3 8 7 6 4 1,问题选讲(3),学生成绩计算。,#include #define M 10 #define N 5 int main() float stu_scoreMN; float ave, sum; float stu_statM2; int i, j;,注意选择GCC编译器!,for (i=0; iM; i+) sum = .0f; for (j=0; jN; j+) scanf(%f, ,浮点型计算顺序,printf函数问题,int main() float val1 = 0.2345634343243,val2 = 2.34546343242, val3

13、 = 56.676762434324342, val4 = 7.879878243243243, val5 = 776.78458424342432,sum, average1,average2; sum = val1 + val2 + val3 + val4 + val5; average1 = (val1 + val2 + val3 + val4 + val5) / 5.0; average2 = sum / 5.0; printf(%fn,average1); printf(%fn,sum / 5.0); printf(%fn,average2); ,知识回顾,字符指针和字符数组的区别,

14、定义方法不同 char str10; /arraychar *ptr;/pointer 赋值方法和含义不同 char str10; char *ptr; str = ”china”; /*错误*/ ptr = ”china”; strcpy(str,”china”); /*正确*/ 字符指针是变量,而数组名是地址常量,知识回顾,字符指针和字符数组的区别,定义数组时,通常在编译时分配内存单元,且有确定地址; 定义字符指针时,如未对它赋初值,则其所指数据是不定的,因而直接使用是危险的。 e.g输入字符串时 char str10; scanf(%s, str); /*正确*/ char *a; ch

15、ar *a; scanf(“%s”, a); char str10; /*错误,指针指向不明*/ a = str; scanf(%s, a); /*正确*/,字符串数组,浪费空间-可改写数组元素,节约空间-不可改写数组元素,二维数组,指针数组,举例:字符串的拷贝,字符数组实现,void MyStrcpy(char to, char from) int i = 0; while (fromi != 0) toi = fromi; i+; toi = 0; ,举例:字符串的拷贝,字符指针实现,void MyStrcpy(char *to, const char *from) while (*fro

16、m != 0) *to = *from; from+; to+; *to = 0; ,while(*to+=*from+) ;,举例:字符串长度,字符数组实现,unsigned int MyStrlen(char str) int i; unsigned int len = 0; for (i=0; stri!=0; i+) len+; return (len); ,unsigned int MyStrlen(char *pStr) unsigned int len = 0; for (; *pStr!=0; pStr+) len+; return (len); ,字符指针实现,举例:字符串排

17、序,二维字符数组实现,char strN10 = Pascal,Basic,Fortran, Java,Visual C; for (i=0; iN-1; i+) for (j = i+1; jN; j+) if (strcmp(strj, stri) 0) strcpy(temp,stri); strcpy(stri,strj); strcpy(strj,temp); ,举例:字符串排序,二维字符数组实现,举例:字符串排序,指针数组实现,char *ptrN = Pascal,Basic,Fortran, Java,Visual C; for (i=0; iN-1; i+) for (j =

18、 i+1; jN; j+) if (strcmp(ptrj, ptri) 0) temp = ptri; ptri = ptrj; ptrj = temp; ,举例:字符串排序,指针数组实现,举例:统计字符串中的空格数,数组实现,int count_spaces(const char s) int count=0, i; for(i=0; si!=0; i+) if(si= ) count+; return count; ,#include #include int main() char p100; gets(p); printf(Spaces count:%dn, count_spaces

19、(p); return 0; ,举例:统计字符串中的空格数,指针实现,int count_spaces(const char *s) int count=0; for(; *s!=0; s+) if(*s= ) count+; return count; ,#include #include int main() char p100; gets(p); printf(Spaces count:%dn, count_spaces(p); return 0; ,字符串惯用法,字符串长度:搜索字符串的结尾,size_t strlen(const char *s) size_t n; for(n=0;

20、 *s!=0; s+) n+; return n; ,size_t strlen(const char *s) size_t n=0; for(; *s!=0; s+) n+; return n; ,size_t strlen(const char *s) size_t n=0; for(; *s; s+) n+; return n; ,size_t strlen(const char *s) size_t n=0; for(; *s+; ) n+; return n; ,字符串惯用法,字符串长度:搜索字符串的结尾,size_t strlen(const char *s) size_t n; for(n=0; *s!=0; s+) n+; return n; ,size_t strlen(const ch

温馨提示

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

评论

0/150

提交评论