《C语言-12-指针 PPT课件》由会员分享,可在线阅读,更多相关《C语言-12-指针 PPT课件(34页珍藏版)》请在金锄头文库上搜索。
1、指针是一个特殊的变量,用来存储另一变量的地址。,P219,指 针,若已说明: int i=10; float k;,内存单元的编号-地址,i,k,编译或函数调用时为其分配内存单元,变量的存储:,10,变量的内容, char *s;,指针变量的类型必须与指向变量的类型一致。,变量名前的*号,仅是一个符号,该符号的存在表示该变量是指针变量。,P221,指针运算符,* 和 ,*p, int *p1, *p2; p1= ,指针变量初始化: int j,k; int *p1 = ,#include main( ) int *p1,*p2, *p, a,b; a=23;b=34; p1=,p1,p2,p,
2、P224.10.2 指针赋值,23,34 34,23,p1=,例:阅读程序,写出运行结果。,#include void main() int a,b=100,*p1,*p2; p1= ,101,101,101,101,将数组元素的地址赋予指针,int a10,*p; p=,将数组名赋予指针变量,int a10,*p; p=a;,#include stdio.h void main() int a5=1,2,3,4,5,*p=a; printf(%d,*p); p=,14,P229,int a10,*p=a;,int a10,*p=,指针的移动,int *p;,p+ 使指针移动到下一个元素的内存
3、位置;该表达式的结果为指针变量p原来指向的位置。 +p 使指针移动到下一个元素的内存位置;该表达式的结果为指针变量p现在所指向的位置。 p- 使指针移动到前一个元素的内存位置;该表达式的结果为指针变量p原来指向的位置。 -p 使指针移动到前一个元素的内存位置;该表达式的结果为指针变量p现在所指向的位置。,指针的移动只对连续存储内存有效,如数组等。,指针的移动,p+i 使指针指向它的对象下面的第i个元素的内存位置;而指针p不动。 p-i 使指针指向它的对象的前面的第i个元素的内存位置;而指针p不动。,其中:i 只能是整型数据。,指针的移动只对连续存储内存有效,如数组等。,int *p;,例:写出
4、下列程序的结果: #include void main() int a=1,2,3,4,5,*p; int i; p=a; printf(%dn,*+p); (1) printf(%dn,-*p); (2) printf(%dn,*p+); (3) printf(%dn,*p+3); (4) printf(%dn,*p-); (5) printf(%dn,*(p+2); (6) printf(“%dn”,*p); (7) for(i=0;i5;i+) printf(%d,ai); (8),2,1,1,6,3,4,11345,1,1,指针与一维数组(数组的指针和指向数组的指针变量),赋值:p=a
5、 ;或 p=,#include void main() int a10,*p ; for(p=a;pa+10;p+) scanf(%d,p); printf(n); for(p=a;pa+10;p+) printf(%4d,*p); ,P233例10.6. 用指针法输入输出一维数组的所有的元素:,注意: scanf语句与printf语句中的输入对象和输出对象的写法。,for(i=0;i10;i+) scanf(%d,p+i);,for(i=0;i10;i+) printf(%4d,*(p+i);,=a,i;,for(i=0;i10;i+) scanf(%d,a+i);,for(i=0;i10;
6、i+) printf(%4d,*(a+i);,(1)数组名a 表示数组的首地址,即a0 的地址。数组名也称为数组指针 。 a p ,而ai又看成是包含4个元素的一维数组的首地址。,二维数组a可看成是由3个元素组成的一个特殊的一维数组。 a0,a1,a2,二维数组的特殊性,已说明:int a34;,二维数组的数组指针,P242,ai是第i行的首地址 ai int *p; for(p= a0 ; pa0+5 ; p+) if( *p%2=0 ) continue; printf(%4d%4d, p0,p4 ); ,p=*a; p=,int a34;,结论:数组指针a为行指针,指针变量p为列指针,行
7、列指针不能相互赋值。,指向二维数组的指针变量,例,阅读下列程序。,#include void main() int a33=1,2,3,4,5,6,7,8,9; int i,j,sum=0; for(i=0;i3;i+) for(j=0;j3;j+) if(i=j|i+j=2) sum+= *(*(a+i)+j); printf(%d,sum); ,定义一个指针变量,使得它指向包含3个元素的一维数组 定义为: int (*P)3,(*p)3=a;,*(*(p+i)+j);,P248,结论:指针变量p为行指针,ap *(*(a+i)+j)*(*(p+i)+j) aij pij,例:填空,使5X5
8、矩阵的两对角线置1,其它元素置0,#include void main () int a55=0,(*p)5,j,k; _ ; for(j=0;j5;j+) *(pj_ )=1; *(pj+5_ )=1; for(j=0;j5;j+) for(k=0;k5;k+) printf(“%2d”,pjk); _ _ _ ; ,p=a,+j,-j-1,printf(“n”),(1)数组 指针a与指针变量p都是行指针, 表示二维数组的首地址,即 a p a0 *a *p *a0 a00 (2)指针变量p也可表示 指针形式,也可表示为下标形式。即 *(*(p+i)+j) *(*(a+i)+j) pij a
9、ij (3)ai为列指针 *(a+i)+j ai+j pi+j printf(“%sn”,st); printf(“%sn”,st+7); ,/*把字符串首地址赋给st,使指针变量指向该字符串的首地址*/,一个字符串用指针方法实现输入输出,/*从字符串的首地址开始输出,直到字符串的0结束*/,/*从字符串的首地址偏移7个位置开始输出,直到字符串的0结束*/,指针变量初始化,指针指向字符串(指针与字符串),P251,指针指向字符串(指针与字符串),#include void main( ) char *st; printf(“%sn”,st); printf(“%sn”,st+7); ,/*把字
10、符串首地址赋给st,使指针变量指向该字符串的首地址*/,P251,st=“I love China”;,例、读下列程序,写出其运行结果是,#include void main() char *p1,*p2; p1=p2=BCDEFG; printf(“%s”,p1); while(*p2!=0) putchar(*p2+); while(-p2=p1) putchar(-*p2); putchar(n); ,F,E,D,C,B,A,#include stdio.h void main( ) char *p=chyab,*q,*r,max; r=p; max=*p+; while(*p!=0)
11、if(max*p) max=*p; q=p ; p+; p=q; while(*p!=0 ) *p=*(p+1); p+; *(p-1)=max; printf(%s,r); ,例.阅读下列程序,输入chyab,写出其运行结果。,chaby,c,h,y,a,b,0,y,1、利用数组: char str4=“abc” ; 或 char str4=“abc”; 2、利用指针: char *sp=“abc”;或 char *sp=“abc”; 或 char *sp; sp=“abc”; 3、利用stcpy函数,字符串赋值的方法总结:,#include void main( ) char a =“I
12、am a boy.”, b20,*p1,*p2; for (_) *p2=*p1; _; printf(“%s”,b); ,例:下列程序完成的功能是:字符串的复制。,p1=a,p2=b;*p1!=0;p1+,p2+,*p2=0,P268,多个字符串用指针方法如何实现?,指针数组,类型名 *数组名数组长度,说明:数组的每个数组元素均为指针类型数据,称为指针数组,也就是说,指针数组中的每一个数组元素都相当于一个指针变量。,如:int *p4 ; 由于 比*优先级高,先有p4形式,p是数组含有4个数组元素。再与p 前面的“*”结合,“*”仅是一种符号表示此数组是指针类型的,每个数组元素(相当于一个指
13、针变量)都可指向一个 int 型变量。,指针指向字符串(指针与字符串),#include stdio.h void main() char *str3= Word,Computer,Program ; int i; for(i=0;i3;i+) printf(%sn,stri); ,指针数组初始化,实现多个字符串的赋值,利用循环结构,实现多个字符串的输出,*str ,指针指向字符串(用指针访问字符串),多个字符串用指针方法实现赋值与输出,char (*p)10; p=str;,使用指针数组时,对所有数组元素须先赋值,后使用,#include stdio.h void main() char s
14、tr 10= WORD,MATH,THEM; int i;,for(i=0;i3;i+) printf(%s, pi); ,p=str;,for(i=0;i3;i+) pi=stri;,WORDMATHTHEM,char *p3;,for(i=0;i3;i+) printf(%s, pi +i ); ,WORDATHEM,指针指向字符串(用指针访问字符串),多级指针(指向指针的指针(二重指针),类型名 *指针变量,P271,指向指针数据的指针变量,简称为指向指针的指针,此指针中存放的是另外一个指针的地址。,已有定义: int a,*q,*p; a=20; q=,a, *q ,*p 的值相同。,#include #include void main() char *str3=abced,dgeg,123456; char *p; int i; p=str; for(i=0;i3;i+) printf(%s,%sn,stri,*(p+)+i); ,例、读下列程序,写出其运行结果。,str0 str1 str2,