《C语言程序设计 教学课件 ppt 作者 刘莹第6章》由会员分享,可在线阅读,更多相关《C语言程序设计 教学课件 ppt 作者 刘莹第6章(42页珍藏版)》请在金锄头文库上搜索。
1、第6章 指 针,6.1 指针与指针变量 6.2 指针变量的定义与引用 6.3 一维数组与指针变量 6.4 字符串与指针变量,本章主要内容,6.1 指针与指针变量,6.1 .1 指针与指针变量,设有:char a; int b; float c;,a的地址,b的地址,C的地址,6.1 指针与指针变量,各变量所占用的第一个内存单元的地址就是该变量的地址。,内存单元的地址称为指针,即指针就是内存单元的地址。,6.1 指针与指针变量,6.1.2 指针变量,C语言中,允许用一个变量来存放指针(地址值),这种专门用于存放地址的变量就是指针变量。,6.1 指针与指针变量,1000H,p(1050H),指针变
2、量p中存放了a变量的地址1000H,则称指针变量p指向变量a。,变量a的地址记作:&a 指针变量:专门存放另一变量的地址的变量。,6.1 指针与指针变量,指针是地址,是一个常量。而指针变量中可以存放不同的地址,是变量。要使用指针变量同样要遵循“先定义,后使用”的原则。,6.2 指针变量的定义和引用,【例6.1】指针变量定义与引用样例。 main( ) int a; int *p; p= ,定义指针 变量p,a的地址存入p,即p指向a,通过p给a赋值100,相当于a=100,a=100,间接访问方式,6.2 指针变量的定义和引用,6.2.1指针变量的定义,指针变量定义的一般形式为:,类型 * 指
3、针变量名;,“类型名”:说明该指针变量中只能存放此类型变量的地址。,“*”:表明其后面的变量是指针变量。,6.2 指针变量的定义和引用,6.2.2 指针变量的引用,只有将指针变量指向某个具体的变量后才能对该指针变量进行引用。但我们知道变量的地址是编译系统分配的,我们如何知道并存入指针变量呢?C语言提供了专门用于取得变量地址的运算符&。,6.2 指针变量的定义和引用,&:取址运算符。用于取得变量的地址。 使用方法如下:,&变量名,“&”是单目运算符,右结合性。且其右侧只能是变量名,而不能是表达式。,6.2 指针变量的定义和引用,指针变量有了明确的指向后,就可以通过指针变量来访问其指向的变量了,换
4、句话说就是除了使用变量名进行直接的访问外,还可以通过指针变量间接地访问。同样,C语言提供了间接访问的运算符*。,6.2 指针变量的定义和引用,*: 取值运算符,用于取得指针变量所指单元中的值。,int m=50, n, *p=,注意:使用取值运算的前提是一定要先将指针变量指向要访问的变量。,等价于:n=m;,6.2 指针变量的定义和引用,int a;,int *p;,w=p=,*p=5;,a,int *w;,a=a+1;,或*p=*p+1;,或*w=*w+1;,等价于int *p,*w;,间取接值运运算算符符,取址运算符,直接存取,间接存取,5,6,6.2 指针变量的定义和引用,【例6.2】分
5、析下面程序的运行结果(程序运行时,从键盘输入1)。 main( ) char a=A, *p1= ,等价于 scanf(“%f”,a=b; b=b+2; c=c+b;,Input c:1 B,68,69.000000,6.2 指针变量的定义和引用,【例6.3】编写程序,使用间接访问方式完成将两个数按从小到大的顺序依次输出的功能。,6.2 指针变量的定义和引用,编程要点: 若两个数分别放在变量m和n中。要使用间接访问方式就必须再定义两个指针变量p和q,将它们分别指向变量m和n。 再假设p指向两个数中的小者,q指向大者。如果mn,就需要将p指向n,q指向m。否则,不需要进行任何操作。最后依次输出p
6、和q所指的变量,就达到了题目的要求。,6.2 指针变量的定义和引用,main( ) int m,n,t,*p,*q; p= ,Input m & n:8 5 min=5,max=8,6.2 指针变量的定义和引用,6.2.3 对指针变量的运算,由于指针有其特定含义,所以对指针变量只能进行有限的运算操作,而不能象int、float等类型的数据那样自由地进行算术、逻辑等各种运算。指针变量可参加以下几种运算。,赋值运算 算术运算 比较运算,6.2 指针变量的定义和引用,【例6.4】指针变量的赋值运算样例。 main( ) int a=5, *p,*q; p= ,使用“取址”运算符给指针变量赋值,同类型
7、指针变量之间可直接赋值,6,6,赋值运算,6.2 指针变量的定义和引用,对指针变量进行加或减一个整数的运算,int a5,*p; p=,p=p+1;,算术运算,指针只能进行加和减两种算术运算,6.2 指针变量的定义和引用,指针的相减运算,当两个指针指向同一片连续的存储区域时,可以对两个指针进行相减运算。,int a5, *p,*q; p=,p-q的值为-4,p-q的值为1,6.2 指针变量的定义和引用,当两个指针指向同一片连续的存储区域时,可以对两个指针进行比较运算。,【例6.5】指针移动与指针比较样例。 main( ) int a10,*p,*q; p=a; q= ,q不大于p -2,移动指
8、针时要避免超范围。如对于一个指向数组首元素的指针p就不能进行p- -的操作,同样对于指向数组最后一个元素的指针q也不能进行q+的操作。,比较运算,6.3 一维数组与指针变量,6.3.1通过指针变量访问一维数组,【例6.6】通过指针访问一维数组程序样例。 main( ) int a10, i, *p; p=a; printf(“Input data:“); for(i=0;i10;i+) scanf(“%d“,p+i); for(i=0;i10;i+) printf(“%5d“,*(p+i); printf(“n“); ,等价于: p=,等价于: scanf(“%d“,等价于: printf(“
9、%5d“,ai);,数组名代表该数组第一个元素的地址,数组元素ai的地址可用a+i或p+i来表示,数组元素ai可用 *(a+i) 以及*(p+i)表示,要通过指针访问数组就必须先将指针指向该数组。,6.3 一维数组与指针变量,6.3 一维数组与指针变量,6.3.2 应用实例,【例6.7】编写程序,定义一个含有30个元素的整型数组,按顺序分别赋予从2开始的偶数,然后按每行10个数顺序输出。要求用指针完成(算法参见【例5.6】)。,6.3 一维数组与指针变量,main( ) int a30, i,*p ; for( p=a,i=0; p=a+29; p+,i+) *p=(i+1)*2; print
10、f(“%4d“,*p); if( (i+1)%10=0) /*利用i判断是否需要换行*/ printf(“n“); ,6.3 一维数组与指针变量,【例6.8】编写程序,输入10个整数放入数组a中,求其中的最小值及其下标并输出。要求用指针实现(算法参见【例5.7】)。,6.3 一维数组与指针变量,main( ) int a10, min , k , i ; int *p=a; printf(“Input 10 numbers:n“); for(i=0; i=9; i+) scanf(“%d“, p+i); min=*p; k=0; for( i=1; i=9; i+) if( *(p+i)min
11、 ) min=*(p+i); k=i; printf(“ min=%d, k=%dn“, min, k); ,Input 10 numbers: 11 22 33 44 1 55 66 20 18 46 ,min=1, k=4,6.3 一维数组与指针变量,【例6.9】设一维整型数组a中存放了N个从小到大有序排列的整数,现从键盘输入另一整数x,要求将x插入数组a中,插入后a数组中的值依然有序。要求用指针实现(算法参见【例5.11】)。,6.3 一维数组与指针变量,编程要点: 为了进行插入,a数组的长度应定义为N+1。 根据x值的大小,确定插入的位置。具体的做法是:设置指针变量p,整型变量k(k用
12、于记录p后移的次数) 将p指向a0。 *p与x进行比较,当*px。此时,k的值就是要插入位置的下标。如果x大于数组中所有的元素,则将k=N。 从插入位置开始的后面的所有元素依次向右移动。注意:要从最后一个元素开始移动。,6.3 一维数组与指针变量,p指向a数组,p指向插入位置,在正确位置插入x后,6.3 一维数组与指针变量,#define N 11 main( ) int a =1,11,22,33,44,55,66,77,88,99; int i,k,x,*=a; printf(“Befor Inserted:n“); for(i=0; i=k+1; i-) ai=ai-1; *p=x; p
13、rintf(“After Inserted:n“); for(i=0; i=N;i+) printf(“%4d“,ai); ,从插入位置及后面的元素向右移动,将x插入,查找插入的位置,6.3 一维数组与指针变量,Befor Inserted: 1 11 22 33 44 55 66 77 88 99 Input x: 50 After Inserted: 1 11 22 33 44 50 55 66 77 88 99,6.4 字符串与指针变量,在C语言中,可以使用两种方法对字符串进行操作。一种是通过字符数组进行引用。有了指针以后,还可以通过字符型指针变量对字符串进行引用。,6.4 字符串与指针
14、变量,【例6.10】通过指针变量引用字符串程序样例。 #include main( ) char *p=“Beijing“; puts(p); p=“Shanghai“; for( ; *p!=0; p+) putchar(*p); ,将字符串“Shanghai“的首地址赋给指针变量p。原来的字符串“Beijing“因为地址的丢失而无法再次引用。,在定义变量p的同时,将字符串“Beijing”的首地址赋给p。,6.4 字符串与指针变量,【例6.11】编写使用指针变量求字符串长度的程序。 #include main( ) char ch81,*p; int i; p=ch; printf(“In
15、put a string:“); gets(ch); puts(ch); for(i=0;*p!=0;i+) p+; printf(“length=%dn“,i); ,程序中首先将p指向字符串的第一个字符,然后不断移动指针,直至p指向串尾为止。每移动一次指针,循环控制变量i加1 。循环结束时,i中的值就是指针移动的次数,也就是字符串的长度。,6.4 字符串与指针变量,【例6.12】编写程序使用指针变量实现两个字符串的拷贝功能(算法参见【例5.21】)。,编程要点: 设置两个字符型指针变量p,q,并分别指向字符串s1和s2。 在循环中,将q指向的字符赋给p指向的单元,然后两个指针都向后移动一个位
16、置,直到q所指字符为0为止。 循环赋值结束后,需要在s1数组有效字符后面追加0,以使s1中存放的字符形成字符串。,6.4 字符串与指针变量,#include main( ) char s150, s220,*p,*q; printf(“Input a string:“); p=s1; q=s2; gets(s2); while(*q!= 0) *p=*q; p+; q+; *p= 0; puts( s1); ,6.4 字符串与指针变量,【例6.14】设从键盘上输入的字符串中包含有至少一个数字字符,编写程序,将字符串中的数字字符按照从左至右的顺序取出并组成一个整数后输出。例如输入的字符串为:xy12z3