《C语言课件:9-2指针与一维数组》由会员分享,可在线阅读,更多相关《C语言课件:9-2指针与一维数组(26页珍藏版)》请在人人文库网上搜索。
1、第九章 指针,指针与一维数组,2,指针特别适用于访问在内存中连续存储的相同类型的数据。如:一维数组、二维数组等。,int a10; int *p; p = /通常指向首元素,以一维数组为例: 先定义一个指向类型为数组基类型的指针,再让指针指向某个数组元素,即可操作数组中的每一个元素。,指针加减运算规则的应用,3,#include main( ) int a5 = 1, 2, 3, 4, 5; int i; for (i = 0; i 5, i+) scanf(%d, ,#include main( ) int a5 = 1, 2, 3, 4, 5, i; int *p= ,下标法,指针法,4,。
2、#include main( ) int a3 = 1, 2, 3; printf(%d, a0); /1 printf(%d, a1); /2 printf(%d, a2); /3 printf(%p, a); /0012FF00 ,数组名本身也具有数值,其内容是数组的首地址,是一个指针常量。,地址与运行环境有关,5,int a4;,数组名是数组首元素的地址 a = ,*( )与 是完全等价的!,等价定律,通式,7,int a10; int *p; p = a;,int a10, *p; p = a;,int a10, *p=a;,int a10, *p= ,int a10; int *p;。
3、 p = ,int a10, *p; p = ,用指针变量访问一维数组,以下几种写法等价:,注意区别: a是常量,p是变量,a是指向首元素的指针常量, 元素指针, 指针类型是int *,8,int a4, *p=a;,注意:一但p的值被改变, 以上等式不成立,9,int a4, *p=a;,p的值被改变后,以上等式仍然成立。 但与a数组元素不对应。,10,#include main( ) int a6 = 1,2,3,4,5,6, *p= /5 ,#include main( ) int a=258, *p= /258 与*p等价 ,11,main( ) int a5, i; for (i =。
4、 0; i 5; i+) scanf(%d, ,main( ) int a5, i; for (i = 0; i 5; i+) scanf(%d, a+i); for (i = 0; i 5; i+) printf(%d , *(a+i); ,下标法,地址法,访问一维数组元素的多种方法,12,main( ) int a5, i, *p = a; for (i = 0; i 5; i+) scanf(%d, p+i); for (i = 0; i 5; i+) printf(%d , *(p+i); ,main( ) int a5, i, *p= ,指针法,指针-下标法,访问一维数组元素的多种方。
5、法,13,指针法(注意指针被改变了),main( ) int a5, i, *p= ,main( ) int a5, *p; for (p = a; p - a 5; p+) scanf(%d, p); for (p = a; p - a 5; p+) printf(%d , *p); ,访问一维数组元素的多种方法,指针法(指针做为循环变量),14,#include #define N 5 main( ) int aN = 5, 7, 3, 6, 2; int *p, max; p = a; max = *p+; for (; p max) max = *p; printf(max=%dn, 。
6、max); ,求一批整数的最大值,#include main( ) int a5=1,2,3,4,5, i, *p; p=a+2; for (i = 0; i 3; i+) printf(%d , pi); /3 4 5 i = (*-p)+; printf(%d , i); /2 printf(%d , a1); /3 ,指针练习,15,char a =1234567890;,16进制表示,指针与字符串,16,char a6 = 12345; /a是指针常量, 指针类型是char *,a+;非法,char *p=a; /p是指针变量, 指针类型是char * char *p=,p+;合法,如。
7、果字符数组中存放的是字符串,则数组名可看做是字符串的首地址。,a, p俗称为字符串。,17,#include main( ) char a20, b = 123; int i; for (i = 0; bi!=0; i+) ai = bi; ai = 0; puts(a); ,#include main( ) char a20, b = 123; int i; for (i = 0; *(b + i); i+) *(a + i) = *(b + i); *(a + i) = 0; puts(a); ,注意:扫描字符串的方法。,复制字符串,18,#include main( ) char a20。
8、, b = 123, *p, *q; for (p = a, q = b; *q; p+, q+) *p = *q; *p = 0; puts(a); ,#include main( ) char a20, b = 123, *s = a, *t = b; while (*s+ = *t+); puts(a); ,指针做为循环变量,上面程序的简化,19,#include main( ) char s = abc; char *t = s; while (*t) t+; printf(%d, t - s); ,#include main( ) char s = abc; char *t = s;。
9、 while (*t+); printf(%d, t - s - 1); ,计算字符串的长度,20,#include main( ) char a20=abc; char b = 123; int i = 0, j = 0; while (ai) i+; while (ai+ = bj+); puts(a); ,#include main( ) char a20 = abc; char b = 123; char *s = a, *t = b; while (*s) s+; while (*s+ = *t+); puts(a); ,连接字符串,21,char a5 = a, b, c, d, 。
10、0; char a5 = a, b, c, d; char a5 = abcd; char a5 = abcd;,a+;合法,char *a = abcd;,char *a; a = abcd; /合法,char a5; a = abcd; /非法,a是指针变量。将字符串的首地址赋给a。,a+;非法,a是指针常量。只能在定义时赋初值。,定义字符串的多种方法(实际上就是两种),22,#include main( ) char a20 = xyz; *a = w; /a+; /错误 printf(%s, a); /结果:wyz,#include main( ) char *a = xyz; /*a。
11、 = w; /错误 a+; printf(%s, a); /结果:yz,字符串被分配在动态数据区(栈)中。 a不能被改变,字符串内容可以被改变。,字符串被分配在静态只读区。 a可以被改变,字符串内容不能被改变。,两种定义字符串方法的对比,23,#include main( ) char *a; /指针未赋值 scanf(%s, a); printf(%s, a); ,错误的,#include main( ) char a20; /分配空间 scanf(%19s, a); printf(%s, a); ,正确的,以下程序的输出结果是( 68 ) char str =ABCD, *p=str; p。
12、rintf(%dn,*(p+3);,练习,24,#include main( ) char a20 = 12345678; char *pc; int * pi; pc = a; pi = (int *)a; /强制类型转换 pc+; pi+; printf(%x, *pc); /32 printf(%x, *pi); /38373635 ,练习:指针类型的强制转换,25,#include void del(char *p) while (*p) p+; while (*-p= ); *+p=0; main( ) char s20; gets(s); del(s); printf(%s, s)。
13、; ,#include main( ) char s20=ABC DE ; char *p; for (p=s; *p!=0; p+); for (p-; *p= ; p-); p+; *p=0; printf(%s, s); ,例题:删除字符串的所有尾部空格,26,#include main( ) char a20=abcdefghij; char *p = a; int i; for (i=0; *p!=0; i+, p+) if (i=6) *p=#; printf(%sn, a); ,#include main( ) char a20=abcdefghij; char *p = a; while (p - a 6) p+; while (*p) *p+=#; printf(%sn, a); ,例题:从下标为6的元素开始全部设置#号。