《昆工C语言-c语言第五讲.ppt》由会员分享,可在线阅读,更多相关《昆工C语言-c语言第五讲.ppt(42页珍藏版)》请在装配图网上搜索。
1、授课教师:杨瑾 ,c语言第五讲,int a=6,*p,*q;,指针复习,p=,6,a,p,q,2001,4001,6001,问:,p的值( ) *p的值() *(,指针复习,6,NULL,a,p,2001,4001,*p=8 不合法 不能通过空指针访问存储单元,p= *p=8 合法 给空指针重新赋值,指向变量a,在通过*p间接访问a. *p等价于a,1,引入:int a=6,b=7 ,*p=,指针变量加1:p+1 含义是指向紧接着的下 一个存储单元b。 p的值为变量a的地址,即2001. p+1的值为变量b的地址,即2003,一维数组和指针,P+1,引用方式: a, *p, *(,一维数组和指。
2、针,引用方法,a,a0,a3,a4,a2,a1,a+1,a+i,main( ) int a5,i; for(i=0;i5;i+) scanf(%d,a+i); printf(n); for(i=0; i5;i+) printf(%d,*(a+i); ,课本p169 例2,一维数组和指针,a,a+i,指针变量p加下标代表该指针指向的具体的存储单元如:p0等价于数组元素a0, p1等价于a1,int a5; int *p=a 或 int *p= for(i=0,p=a;i5;i+) scanf(%d,p+i); printf(n); for(p=a; pa+5;p+) printf(%d,*p);。
3、 ,p+1,p+i,p,a0,a3,a4,a2,a1,注意:p:指针变量,可以重新赋值,如p= int *p=a 或 int *p= int *p= ,p,q,课本p170 例4,一维数组和指针,main( ) int i ,s=0,t=1,2,3,4,5,6,7,8,9; for(i=0;i9;i+=2) s+=*(t+i); printf(“%dn“,s); ,习题p50 13,一维数组和指针,main( ) int a10=1,2,3,4,5,6,7,8,9,10,*p=a; printf(“%dn“,*(p+2); ,p,P+2,一维数组和指针,main( ) int a10=2,4,。
4、6,8,10,y=0,x,*p; p= ,p,习题p50 15,p1等价于*(p+1) px等价于*(p+x),课本p169 例1,一维数组和指针,main( ) int a5=1,2,3,4,5,6,7,8,9,10; int *p= ,p,q,数组a可看成是具有两个数组元素a0,a1的一维数组,而a0,a1有分别是具有三个数组元素的一维数组。,int a24;,二维数组和指针,a0,a1,a,a0,a0+1,a1+1,引用方法: a11,*(,二维数组和指针,a0,a1,a,p+1,int *p=,p,p等价于a0, p+1等价于a0+1, p+2等价于a0+2, p+3等价于a1, p+。
5、4等价于a0+1, p+5等价于a1+2, p0等价于a00, . , p2等价于a02,引用方法: a11,*(,二维数组和指针,a0,a1,a,引用方法: a11,*( int a24;,二维数组和指针,p,引用方法:*(p1+1), *(*(p+1)+1), p11(指针变量加下标代表它所指向的具体存储单元),p+1,p0等价于 int a32; p=a;,二维数组和指针,p,引用方法:*(p1+1), *(*(p+1)+1), p11,p+1,p+2,注意:区分 int *p2; int (*p)2,main( ) int a33,*p,i; p= ,习题p51 23,二维数组和指针,。
6、p,注意指针变量名加下标的含义。,main( ) int a33,*p,i; p= ,习题p51 24,二维数组和指针,p,注意指针变量名加下标的含义。,main( ) int a32=0,(*ptr)2,i,j; for(i=0;i2;i+) ptr=a+i; scanf(“%d”,*ptr); ptr+; for(i=0;i3;i+) for(j=0;j2;j+) printf(“%2d”,aij); printf(“n”); ,习题p51 25,二维数组和指针,ptr,main( ) int a3=1,2,3,4,5,0,(*pa)3,i; pa=a; for(i=0;i3;i+) if。
7、(i2) pa1i=pa1i-1; else pa1i=1; printf(“%d”,a01+a11+ a12); ,习题p51 31,二维数组和指针,ptr,void fun(int x,int y) int t=0; if(xy) t=x;x=y;y=t; main( ) int a=1,2,3,4,5,s=0; fun(a3,a2); printf(“%d,%d”,a2,a3); ,1.一维数组元素作实参,数组和函数,int fun(int *x,int n) int i,sum=0; for(i=0;in;i+) sum=sum+xi; return sum; main( ) int 。
8、a=1,2,3,4,5,s=0; fun(a,5); printf(“%dn”,s); ,2.一维数组名作实参,数组和函数,x,还可写成 int fun(int x ,int n) 或(int x5,int n),void sum(int p ) p0=p-1+p1; main( ) int a10=1,2,3,4,5,6,7,8,9,10; sum( ,3.一维数组元素地址作实参,数组和函数,p,void fun(int a3,int b3) int i,j; for(i=0;i3;i+) for(j=0;j3;j+) bij=aji; main( ) int a33=1,2,3,4,5,6。
9、,7,8,9;int b33; fun(a,b); for(i=0;i3;i+) for(j=0;j3;j+) printf(“%3dn”,bij); ,4.二维数组名作实参,数组和函数,还可写成 (int a33,int b33) 或(int (*a)3,int (*b)3),fun(int *a) main( ) int a33,*p3; for(i=0;i3;i+) pi=ai; fun(p); ,5.指针数组作实参,数组和函数,还可写成 (int *a ) (int *a3),void change(int k) k0=k5; main( ) int x10=1,2,3,4,5,6,7。
10、,8,9,10,n=0; while(n=4) change( ,习题 p95 2,数组和函数,int fun(int x,int n) static int sum=0; for(i=0;in;i+) sum+=xi; return sum; main( ) int a=1,2,3,4,5,b=6,7,8,9,s=0; s=fun(a,5)+fun(b,4); printf(“%dn”,s); ,习题 p95 3,数组和函数,int fun(int x,int n) static int sum=0; for(i=0;in;i+) sum+=xi; return sum; main( ) i。
11、nt a=1,2,3,4,5,b=6,7,8,9,s=0; s=fun(a,5)+fun(b,4); printf(“%dn”,s); ,习题 p95 3,数组和函数,用户定义类型,typedef 类型名 标识符; 1. typedef int ZHENG_SHU; ZHENG_SHU a,b; /等价于 int a,b; 2. typedef int *INTP; INTP p,q; /等价于 int *p,*q; 注意:是typedef int *INTP; 不是typedef *int INTP;,用户定义标识符,一般用大写字母表示,已定义过的数据类型 (如:int char ),关键字。
12、 作用:用用户标识符来代替一个已存在的类型名。,宏定义,不带参数的宏定义 #define 宏名 替换文本 或 #define 宏名 如:#define PI 3.1415926 #define ADDPI (PI+1) #define ADDPI2 PI+1,/替换文本中又包含宏名PI,x=2*ADDPI x=2*ADDPI2 printf(“PI is:”); 输出结果:PI is:,x=2*(PI+1)=2*(3.1516926+1),x=2*PI+1=2*3.1516926+1,用替换文本简单替换宏名,不做计算。 (宏展开),双引号中不替换,带参数的宏定义 #define 宏名(形参表)。
13、 表达式 如:#define ADD(x,y) (x+y) #define ADD2(x,y) x+y,宏定义, x=2*ADD(2,3) x=2*ADD2(2,3) 注意:带参数的宏定义与函数的区别。 1. 形参不指定类型。 2. 宏替换不占运行时间。,x=2*(2+3)=10,x=2*2+3=7,宏展开时,用表达式替换宏名,实参代替形参(简单替换),文件包含,标识符作用域,存储分类,变 量,局部 变量,全局 变量,自动变量(auto),寄存器变量(register),静态变量(static),说明 方式,extern,static,main() int i=1,i_sum; float f。
14、,f_sum; int i; i=10; printf(“(1)i=%dn”,i); printf(“(2)i=%dn”,i); ,main() register int i=1; int s=0; for(i=0;i100;i+) s+=I; printf(“s=%dn”,s); ,fun(int a) int b=0;static int c=3; b+; c+; return (a+b+c); main() int i,a=5; for(i=0;i3;i+) printf(“ %d %dn”,i,fun(a); printf(“n”); ,标识符作用域,存储分类,变 量,局部 变量,全局。
15、 变量,自动变量(auto),寄存器变量(register),静态变量(static),说明 方式,extern,static,int sum; int fun1( ) sum+=20; int a; int fun2( ) a+20; sum+=a; main() sum=0; fun1(); a=8; fun2(); printf(“sum=%d a=%d”,sum,a); ,void fun2(char a,char b) printf(%c%c,a,b); char a=A,b=B; void fun1( ) a=C,b=D; main( ) fun1(); printf(%c%c,a。
16、,b); fun2(E,F); ,习题p78 例14,标识符作用域,存储分类,全局变量 a,b作用域,int f( ) static int i=0; int s=1; s+=i;i+; return s; main( ) int i,a=0; for(i=0;i5;i+) a+=f(); printf(%d,a); ,习题p78 例15,标识符作用域,存储分类,静态局局变 量i作用域,动态存储分配,1. malloc函数 int *p; p=(int *)malloc(4); 或 p=(int *)malloc(sizeof(int); 注意: 分配的存储单元无确定初值; 单个数据类型 手动释放 free(p);,动态存储分配,1. calloc函数 int *p; p=(int *)calloc(2,4); 或 p=(int *)malloc(2,sizeof(int); 注意:连续的同类型数据存储单元; 手动释放 free(p);,#include main( ) char *p,*q; p=(char *)malloc(sizeof(char)*20);p=q; scanf(“%s%s”,p,q); printf(%s%sn,p,q); 从键盘输入:abc def,结果:,习题p78 例17,标识符作用域,存储分类。