好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

C_chapter6.1 (2).ppt

36页
  • 卖家[上传人]:人***
  • 文档编号:585911873
  • 上传时间:2024-09-03
  • 文档格式:PPT
  • 文档大小:684.50KB
  • / 36 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • «变量存储类型静态动态存储方式程序整个运行期间函数调用开始至结束生存期编译时赋初值,只赋一次每次函数调用时赋初值自动赋初值0或空字符不确定未赋初值静态存储区动态区存储区寄存器局部变量外部变量作用域定义变量的函数或复合语句内本文件其它文件u局部变量默认为auto型uregister型变量个数受限,且不能为long, double, float型u局部static变量具有全局寿命和局部可见性u局部static变量具有可继承性uextern不是变量定义,可扩展外部变量作用域register局部staticauto外部static外部存储类别复习 Chapter_6 pointer(指针)C程序设计中使用指针可以:l使程序简洁、紧凑、高效l有效地表示复杂的数据结构l动态分配内存l得到多于一个的函数返回值 §6.1 指针的概念«变量(variable)与地址(address)程序中: int i; float k; 内存(memory)中每个字节(byte)有一个编号-----地址…...…...2000200120022005内存02003ik 编译(compile)或函数调用(call)时 为其分配内存单元变量是对程序中数据存储空间的抽象 …...…...2000200420062005整型变量i10变量i_pointer200120022003«指针与指针变量v指针:一个变量的地址v指针变量:专门存放变量地址的变量叫~2000指针指针变量 变量的内容 变量的地址指针变量变量变量地址(指针)变量值指向地址存入指针变量 «&与*运算符 (operator)v含义含义: 取变量的地址单目运算符优先级: 2结合性:自右向左含义: 取指针所指向变量的内容单目运算符优先级: 2结合性:自右向左v两者关系:互为逆运算v理解…...…...2000200420062005整型变量i10变量i_pointer2001200220032000指针变量i_pointer-----指针变量,它的内容是地址量*i_pointer----指针的目标变量,它的内容是数据&i_pointer---指针变量占用内存的地址200010i_pointer*i_pointer&i_pointerii_pointer &i &(*i_pointer)i *i_pointer *(&i)i_pointer = &i = &(*i_pointer)i = *i_pointer = *(&i) «直接访问与间接访问 (access)v直接访问:按变量名存取变量值v间接访问:通过存放变量地址的变量去访问变量例 i=3; -----直接访问指针变量…...…...2000200420062005整型变量i10变量i_pointer20012002200320003例 *i_pointer=20; -----间接访问20 指针变量…...…...2000200420062005整型变量i10变量i_pointer2001200220032000整型变量k例 k=i; --直接访问 k=*i_pointer; --间接访问10例 k=i; k=*i_pointer; §6.2 指针变量指针变量与其所指向的变量之间的关系«指针变量的定义(definition)v一般形式: [存储类型] 数据类型 *指针名;3变量i2000i_pointer*i_pointeri*i_pointer&ii_pointeri=3;*i_pointer=33变量i2000i_pointer*i_pointeri*i_pointer&ii_pointeri=3;*i_pointer=3合法标识符指针变量本身的存储类型指针的目标变量的数据类型表示定义指针变量不是‘*’运算符例 int *p1,*p2; float *q ; static char *name;注意:1、int *p1, *p2; 与 int *p1, p2;2、指针变量名是p1,p2 ,不是*p1,*p23、指针变量只能指向定义时所规定类型的变量4、指针变量定义后,变量值不确定,应用前必须先赋值 «指针变量的初始化(initialization)一般形式:[存储类型] 数据类型 *指针名=初始地址值;赋给指针变量,不是赋给目标变量例 int i; int *p=&i;变量必须已说明过类型应一致例 int *p=&i; int i;例 int i; int *p=&i; int *q=p;用已初始化指针变量作初值例 main( ) { int i; static int *p=&i; .............. } ()不能用auto变量的地址去初始化static型指针 例 main( ) { int i=10; int *p; *p=i; printf(“%d”,*p); }危险!例 main( ) { int i=10,k; int *p; p=&k; *p=i; printf(“%d”,*p); }指针变量必须先赋值,再使用…...…...2000200420062005整型变量i10指针变量p200120022003随机 «零指针与空类型指针v零指针:(空指针)l定义:指针变量值为零l表示: int * p=0; p指向地址为0的单元,系统保证该单元不作它用表示指针变量值没有意义#define NULL 0int *p=NULL:lp=NULL与未对p赋值不同l用途: u避免指针变量的非法引用u在程序中常作为状态比较 例 int *p; ...... while(p!=NULL) { ...… }vvoid *类型指针l表示: void *p; l使用时要进行强制类型转换例 char *p1; void *p2; p1=(char *)p2; p2=(void *)p1;表示不指定p是指向哪一种类型数据的指针变量 例 指针的概念main(){ int a; int *pa=&a; a=10; printf("a:%d\n",a); printf("*pa:%d\n",*pa); printf("&a:%x(hex)\n",&a); printf("pa:%x(hex)\n",pa); printf("&pa:%x(hex)\n",&pa);}运行结果:a:10*pa:10&a:f86(hex)pa:f86(hex)&pa:f88(hex)…...…...f86f8af8cf8b整型变量a10指针变量paf87f88f89f86 例 输入两个数,并使其从大到小输出main(){ int *p1,*p2,*p,a,b; scanf("%d,%d",&a,&b); p1=&a; p2=&b; if(ap2 表示p1指的元素在后up1==p2 表示p1与p2指向同一元素l若p1与p2不指向同一数组,比较无意义lp==NULL或p!=NULL «数组元素表示方法a[0]a[1]a[2]a[3]a[9]...aa+9a+1a+2地址元素下标法a[0]a[1]a[2]a[9]a[0]a[1]a[2]a[3]a[9]...pp+9p+1p+2地址元素指针法*p*(p+1)*(p+2)*(p+9)[] 变址运算符a[i]  *(a+i)a[i]  p[i]  *(p+i) *(a+i)*a*(a+1)*(a+2)*(a+9)p[0]p[1]p[2]p[9] a[0]a[1]a[2]a[3]a[4]例 数组元素的引用方法main(){ int a[5],*pa,i; for(i=0;i<5;i++) a[i]=i+1; pa=a; for(i=0;i<5;i++) printf("*(pa+%d):%d\n",i,*(pa+i)); for(i=0;i<5;i++) printf("*(a+%d):%d\n",i,*(a+i)); for(i=0;i<5;i++) printf("pa[%d]:%d\n",i,pa[i]); for(i=0;i<5;i++) printf("a[%d]:%d\n",i,a[i]);}12345pa 例 int a[]={1,2,3,4,5,6,7,8,9,10},*p=a,i; 数组元素地址的正确表示:(A)&(a+1) (B)a++ (C)&p (D)&p[i]数组名是地址常量p++,p-- ()a++,a-- ()a+1, *(a+2) () 例 void main() { int a []={5,8,7,6,2,7,3}; int y,*p=&a[1]; y=(*--p)++; printf(“%d ”,y); printf(“%d”,a[0]); } 输出:5 6pp58762730123456a例 注意指针变量的运算6 main(){ int i,*p,a[7]; p=a; for(i=0;i<7;i++) scanf("%d",p++); printf("\n"); for(i=0;i<7;i++,p++) printf("%d",*p);}例 注意指针的当前值p=a;pp58762730123456apppppp指针变量可以指到数组后的内存单元 «数组名作函数参数v数组名作函数参数,是地址传递v数组名作函数参数,实参与形参的对应关系实参形参数组名指针变量数组名指针变量数组名数组名指针变量指针变量 例 将数组a中的n个整数按相反顺序存放 实参与形参均用数组void inv(int x[], int n){ int t,i,j,m=(n-1)/2; for(i=0;i<=m;i++) { j=n-1-i; t=x[i]; x[i]=x[j]; x[j]=t; }}main(){ int i,a[10]={3,7,9,11,0,6,7,5,4,2}; inv(a,10); printf("The array has been reverted:\n"); for(i=0;i<10;i++) printf("%d,",a[i]); printf("\n");} 例 将数组a中的n个整数按相反顺序存放 void inv(int *x, int n){ int t,*p,*i,*j,m=(n-1)/2; i=x; j=x+n-1; p=x+m; for(;i<=p;i++,j--) { t=*i; *i=*j; *j=t; }}main(){ int i,a[10]={3,7,9,11,0,6,7,5,4,2}; inv(a,10); printf("The array has been reverted:\n"); for(i=0;i<10;i++) printf("%d,",a[i]); printf("\n");}￿实参用数组,形参用指针变量 例 将数组a中的n个整数按相反顺序存放 void inv(int *x, int n){ int t,*i,*j,*p,m=(n-1)/2; i=x; j=x+n-1; p=x+m; for(;i<=p;i++,j--) { t=*i; *i=*j; *j=t; }}main(){ int i,a[10],*p=a; for(i=0;i<10;i++,p++) scanf("%d",p); p=a; inv(p,10); printf("The array has been reverted:\n"); for(p=a;p

      这样的结果如将程序中如将程序中p=&a[0];改成改成p=a;程序能得程序能得到正确的结果到正确的结果吗,说明原因吗,说明原因6.2有一个数组有一个数组a[10]={8,7,3,-2,19,1,18,21,-3,4}参考上题,参考上题,编写一个程序,要求使用指针将数组中下标为奇数的元编写一个程序,要求使用指针将数组中下标为奇数的元素输出。

      点击阅读更多内容
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.