C语言程序设计(第六章).ppt_第1页
C语言程序设计(第六章).ppt_第2页
C语言程序设计(第六章).ppt_第3页
C语言程序设计(第六章).ppt_第4页
C语言程序设计(第六章).ppt_第5页
已阅读5页,还剩71页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第六章 指针 本章主要内容 指针概述 地址 指针 指针变量 多重指针 指针变量作为函数参数 指针与数组 数组、指针与函数调用 行指针 指针数组 带参数的主函数 指针与函数 指向函数的指针变量 返回指针值的函数 一、指针概述 1地址(address) P190 如果在程序中定义了一个“实体”(变量、数组、函数 ),编译时系统就要给这些实体分配内存单元。 分配规则: 存储类型 register auto atatic extern 决定存储区域(动态存储区/静态存 储区/寄存器组) 数据类型 char int float double等 决定占用的内存长度(字节数)和 存储方式(ASCII码、补码等) 什么是内存单元“地址”? 内存单元是以字节为单位,每个字节都有 一个编号(即“地址”)。如果将内存比作一个 旅馆,内存单元就好比“床位”,而实体则好比 “旅客”。这些“旅客”(实体)中,有单人型( char)、夫妇型(int)、家庭型( float,long,double等),还有团体型(数组等 )。每个“实体”占用的内存单元是不同的。如 : char a; int b; float c; int d3; int max( ) 内存单元与地址 void main()void main() char a; char a; intint b; b; float c; float c; intint d3; d3; intint max( ); max( ); 地址 通常我们关心的不是各个内存单元的具体地址值,而是每个实 体的“起始地址”。 如何表示实体地址? n实体地址表示法1:直接访问(实体名) u 普通变量a,b,c char *b; float *c; 通常在C语言中,所谓“指针”就是指“指针变量”。 从现在开始,我们所说的“指针”除非另加说明, 否则均表示“指针变量”。 是不是说地址有” 整型” , ”字符型” , ”实型” 之分? 为什么要使用指针变量? C程序中访问(读写)变量有两种方式: 直接访问 (按名单预留的座位入座) 利用实体名访问变量。访问变量的过程 变量(实体)名定义时分配的地址变量值 好比“先坐再买票”看电影:来一个观众,分配一个空位给 他去坐,并且还要在纸上记一个某人坐在哪里。这种方式对 用户来说很方便(“直接就座”),但对系统来说,“找某人”就 极不方便(间接:查名字座号)。 间接访问 (先买票,后按号入座) 把变量地址先存放在“指针”中,再通过“指针”访问变量。 好比先买票(票指针,座号地址),再“按号入座”看 电影。这种方式对用户来说属于“间接就座”,便对系统查找 来说就很直接,且便于处理。尤其对于数组(团体),可通 过指针简单自加或自减,对整个数组进行处理。 习惯用语: 若指针变量p存放了变量a的地址,我们称“p指向a”。 指针变量不要谈”指”色变 指针是C语言学习中的一大难点。 难难在概念。 void main() int a,*p1,*p2= a=100; p1=p2; *p1=*p2; 学了半天,我 还是一头雾水 首先搞定*p 请看以下变量声明语句 int a,*p1; char b,*p2; a,b 普通变量(存放某个数值或字符) p1,p2 指针变量(存放某个实体的地址) 如果是 intint *a,p1; *a,p1; char *b,p2; char *b,p2; 变量声明时,如果变量名前带 *号,表 示该变量是个指针变量 注意不同的*p 以下程序中哪些语句是错误的? void main() int a,*p; a=3; p=3; /*或者 p=a;*/ p= *p=a; /*或者*p=3*/ 讨论: 程序中引用变量时, 对指针变量p, 不带*号引用表示? 带*号引用表示? 两个特殊的运算符 a=100; p1=p2; *p1=*p2; *p并非就这么简单 *p的含义与p所指的对象有关 如果p被定义成指向普通变量的指针变量,则*p代 表该变量的值。 如 int *p,a=5; p= 则*p代表变量a的值(5)。 如果p被定义成指向某个数组的指针变量,则*p代 表该数组中某个元素的值。 如 int *p, a3=1,2,3; p=a; 则*p代表数组a中第1 个元素,*(+p)代表a中第2个元素。 看看两个例子 #include void main() int a,b=10,*p; p= a=*p+3; printf(“a=%d,b=%d n“,a,b); void main() int *p,a12=1,2,3,4,5; p=a; for ( ;*p void main() int *p1=NULL,*p2; *p1=100; *p2=200; printf(“%d,%dn“,*p1,*p2); *p1有确定地址,但未指向任何变量 *p2无确定地址,是“危险指针” 在指针p指向某个实体的 地址之前,不可对*p进行 赋值。否则可能发生意想 不到的错误(p随便指向 某个单元)。 指针变量的算术运算 指针只有两种算术运算加、减 p+5 p+ p-1 p- 注意加减运算是以实体为单位而不是以字 节为单位。 此外,两个指针变量可以相减。即:如果 两个指针变量指向同一数组时,两个指针变 量值之差是两个指针之间的元素个数。参见 P197。 但两个指针变量相加并无实际意义。 以下程序哪个语句执行时会出错? void #include void main() int a10,*p1=a; clrscr(); a+; p1+; X 指针的逻辑比较 P195 指针变量指向同一个 对象(如数组)的不同 单元地址时,才可以进 行比较。地址在前者为 小。 任何指针变量或地址 都可以与NULL作相等或 不相等的比较。如 if(p=NULL) #include #include void fun(char *w,int n) char t,*s1,*s2; s1=w; s2=w+n-1; while (s1 void fun(int *i) static int a=1; *i+=a+; main() int k=0; fun( fun( printf(“%dn“,k); 结果:3 为了实现: 在被调函数中改变实体值,然后在主 调函数中使用这些改变了的实体值 主要技术要点在于: 主调函数的实参和被调函数对应的 形参都必须用地址表示(地址传递) 用于作实参的地址可以是: clrscr(); p=a; for(i=0;i void main() int a33=1,2,3,4,5,6,7,8,9; int *p,i,j=0; system(“cls“); p=a; /* for (i=0;i void main() int a33=1,2,3,4,5,6,7,8,9; int *p,i; system(“cls“); p=a; for (i=0;i void main() int a33=1,2,3,4,5,6,7,8,9; int *p,i,j; system(“cls“); p=a; for (i=0;i void main() int a33=1,2,3,4,5,6,7,8,9; int *p,i; system(“cls“); p=a; for (i=0;i void main() int a33=1,2,3,4,5,6,7,8,9; int *p,i,j; system(“cls“); p=a; for (i=0;i1) +argv; printf (%sn,*argv); -argc; return 0; leifc dwrah twfos ar 0era e 0 0 argv0 argv1 argv2 argv argc=3 如果从键盘输入的命令行为: cfile hardware software 则输出为: hardware software 因为argc初值为3,每次循环减1,故 其循环两次。第一次时,先使argv指向argv1 ,然后输出argv1指向的字符串 “hardware”,第二次开始时,又使argv指向argv 2,然后输出“software”。 用带参的main函数可以直接从命令行得到 参数值(这些值是字符串),在程序运行时可以根据输 入的命令行中的不同情况进行相应的处理。例如,在 使用数据文件时,可以根据不同的需要输入不同的命 令行;以打开不同的文件(有关文件的概念和使用将 在第8章介绍)。 利用main函数中的参数可以使程序从系统 得到所需的数据,或者说,增加了一条系统向程序传 递数据的渠道,增加了处理问题的灵活性。 其实main的形参名并不一定非用argc和 argv不可,只是习惯上一般用这两个名字。如果改用 别的名字,其数据类型不能改变,即第一个形参为int 型,第二个形参为指针数组。 顺便说明一个问题:在本例中用到 argv+的运算,是使argv的值自加。而argv是数组名 。以前说过数组名代表一个常量,它是数组起始地 址,它是不能进行自加运算的,是不能改变其本身 的值的。例如下面程序是不能通过编译的: main ( ) int a5; int i; for (i=0;i1) printf(“%s “,argv-argc); printf(“n“); 将该文件编译后,在命令行输入:test abc 123则该 程序运行结果是什么? 结果:123 abc 指针数组的典型应用 【例二】以下程序经过编译连接后得到的可执行文件名为 echo.exe,在dos提示符下输入 ,则在屏幕上将显示My computer。 #include void main(int argc,char *argv) int i; for (i=1;i #include #define STUDENT_NUM 3 int main ( ) double *p=NULL, sum=0.0; int i; p=(double *)calloc(STUDENT_NUM*sizeof(double); if(!p) printf(“

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论