第9章指针 指针是C语言的重要概念和特色。使用指针,可 以使程序更加简洁、紧凑、高效。 教学目的: 掌握指针的概念,指针变量的概念、定义与应用, 指向1维数组(字符串)的指针变量应用,指针数组与 带参主函数: 了解返回指针值的函数等。 2024/10/28
2024/10/28 1 第9章 指 针 指针是C语言的重要概念和特色。使用指针,可 以使程序更加简洁、紧凑、高效。 教学目的: 掌握指针的概念,指针变量的概念、定义与应用, 指向1维数组(字符串)的指针变量应用,指针数组与 带参主函数; 了解返回指针值的函数等
教学内容: 9.1指针和指针变量的概念 9.2*指针变量的定义与应用 9.3*1维数组的指针与列指针变量 9.4字符串的指针和指向字符串的指针变量 9.5*指针数组与主函数main0的参数 9.6返回指针值的函数 本章要点 本章作业与上机实践 2024/10/28 2
2024/10/28 2 教学内容: 9.1 指针和指针变量的概念 9.2* 指针变量的定义与应用 9.3* 1维数组的指针与列指针变量 9.4 字符串的指针和指向字符串的指针变量 9.5* 指针数组与主函数main()的参数 9.6 返回指针值的函数 本章要点 本章作业与上机实践
9.4字符串指针和指向字符串的指针变量 第6章指出:1维字符数组用于存储1个字符串 (每个元素存放1个字符),2维字符数组用于同时存 储多个字符串(每一行存储1个字符串)。 对于字符数组的处理有两种方式:逐个字符方式 和整体方式。 字符串在内存中的起始地址称为字符串的指针, 可以定义一个字符指针变量指向一个字符串。 2024/10/28 3
2024/10/28 3 9.4 字符串指针和指向字符串的指针变量 第6章指出:1维字符数组用于存储1个字符串 (每个元素存放1个字符),2维字符数组用于同时存 储多个字符串(每一行存储1个字符串)。 对于字符数组的处理有两种方式:逐个字符方式 和整体方式。 字符串在内存中的起始地址称为字符串的指针, 可以定义一个字符指针变量指向一个字符串
9.4.1字符串的表示与引用 字符串的表示:字符数组+字符指针变量; 字符串的引用:逐个引用+整体引用。 1、逐个引用 「案例9.8]1使用字符指针变量表示和处理字符串。 2024/10/28 4
2024/10/28 4 9.4.1 字符串的表示与引用 字符串的表示:字符数组 + 字符指针变量; 字符串的引用:逐个引用 + 整体引用。 1、逐个引用 [案例9.8] 使用字符指针变量表示和处理字符串
#include "std 用串常量首地址 存储在由系统自动开辟 #include "cor 初始化string 的内存块中,并在串尾 void main() 添加一个结束标志’0'。 char *string="I love Beijing." for(;*string!=0';string++) printf"%oc",*string);) 等价于: printf"An"); char *string: getch(); string="I love Beijing."; 思考: (1)在forO之后,再重复上述for0,输出结果如何? (2)将forO改为:for(i=0,*(string+i)I=0;i++) printf(%c”,*(string+i);,再重复之,输出结果如何? 2024/10/28 5
2024/10/28 5 #include "stdio.h" #include "conio.h" void main() { char *string= “I love Beijing. ” ; for( ; *string != ’\0’;string++) { printf(“%c”, *string); } printf(“\n”); getch(); } 思考: (1) 在for()之后,再重复上述for(),输出结果如何? (2) 将for()改为:for( i=0; *(string + i ) != ‘\0’; i++) printf(“%c”, *(string+i));,再重复之,输出结果如何? 等价于: char *string; string="I love Beijing."; 用串常量首地址 初始化string。 存储在由系统自动开辟 的内存块中,并在串尾 添加一个结束标志’\0’
2、整体引用 「案例9.91采取整体引用的办法,改写案例9.81。 #include "stdio.h" 系统首先输出string指向的当前字 符,然后自动使string+I(不是 #include "conio.h" string++),指向下一个字符;重复上 void mainO) 述过程,直至遇到?0。 char *string ="I love Beijing."; printf("%sn",string); getch(); 思考:重复上述orintf(),输出结果如何? 2024/10/28 6
2024/10/28 6 2、整体引用 [案例9.9] 采取整体引用的办法,改写[案例9.8]。 #include "stdio.h" #include "conio.h" void main() { char *string = ”I love Beijing.”; printf(“%s\n”, string); getch(); } 思考:重复上述printf( ),输出结果如何? 系统首先输出string指向的当前字 符,然后自动使string+1(不是 string++),指向下一个字符;重复上 述过程,直至遇到’\0’
3、字符指针变量与字符数组之比较 (1)存储内容不同 字符指针变量,存储的是字符串首地址;字符数 组,存储的是字符串本身(数组名表示字符串首地址)。 (2)字符指针变量的值,是可以改变的;数组名代 表数组的起始地址,是一个常量,是不能被改变的。 2024/10/28 7
2024/10/28 7 3、字符指针变量与字符数组之比较 (1)存储内容不同 字符指针变量,存储的是字符串首地址;字符数 组,存储的是字符串本身(数组名表示字符串首地址)。 (2)字符指针变量的值,是可以改变的;数组名代 表数组的起始地址,是一个常量,是不能被改变的
(3)赋值方式不同 char *pointer,char array[20]; pointer ="This is a example."; /*合法*/ char array ="This is a example."; /*非法*/ 2024/10/28 8
2024/10/28 8 (3) 赋值方式不同 char *pointer, char_array[20]; pointer = “This is a example.”; /*合法*/ char_array = "This is a example."; /*非法*/
9.4.2字符串指针作函数参数 [案例9.10]编写1个自定义函数void string copy((char *str from,char*str to),实现字符串的复制。 #include "stdio.h" #include "conio.h" void string_copy(char *str_from,char *str_to) 循环体为空语句 inti=0; for(;(*(str_to+i)=*(str_from+i))!=\0';++) 先复制、后判断。’0复制吗? 2024/10/28 9
2024/10/28 9 9.4.2 字符串指针作函数参数 [案例9.10] 编写1个自定义函数void string_copy(char *str_from, char *str_to),实现字符串的复制。 #include "stdio.h" #include "conio.h" void string_copy(char *str_from, char *str_to) { int i = 0; for(; ( *(str_to + i) = *(str_from + i)) != '\0'; i++) ; } 循环体为空语句 先复制、后判断。’\0’ 复制吗?
void mainO char array_str1[20]="I am a teacher."; char array_str2[20; 数组名作实参 string_copy(array_str1,array_str2); printf("array_str2=%s\n",array_str2); getch(); [返回] 2024/10/28 10
2024/10/28 10 void main() { char array_str1[20] = "I am a teacher."; char array_str2[20]; string_copy(array_str1, array_str2); printf("array_str2 = %s\n", array_str2); getch(); } [返回] 数组名作实参