课件计算概论Lecture 15_第1页
课件计算概论Lecture 15_第2页
课件计算概论Lecture 15_第3页
课件计算概论Lecture 15_第4页
课件计算概论Lecture 15_第5页
已阅读5页,还剩49页未读 继续免费阅读

下载本文档

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

文档简介

1、计算概论(Introduction to Computing),主讲人:马思伟 北京大学数字媒体研究所 ,第十五讲 指针,函数的定义,函数的定义: 返回值类型 函数名 (参数1类型 参数名1, 参数2类型 参数名2,) 语句1; / 语句可能与参数有关 语句2; / 语句可能与参数有关 return 返回值; / 如果返回值类型为void,则不用返回语句,或返回值为空 ,函数说明和函数体,int multiple(int x,int y); /函数说明 void main() int a=0,b=0; scanf(“%d %d”, ,形参和实参,形参 定义函数时函数名后面括号中的变量名 实参

2、调用函数时函数名后面括号中的参数,可以是常量、变量、表达式 int max(int x, int y); void main() int a, b, c; scanf(“%d, %d”, ,全局变量和局部变量,变量可分为全局变量和局部变量,它们具有不同的作用域。 局部变量(内部变量):函数体内定义的变量,此变量仅在该函数内使用 全局变量(外部变量):函数之外定义的变量,可为本文件中的其他函数所共用,全局变量和局部变量,局部变量(内部变量):函数体内定义的变量,此变量仅在该函数内使用。 不同函数内可以使用相同名字的变量 形式参数也是局部变量。 复合语句中的变量仅在本复合语句中有效,复合语句结束即

3、释放内存,全局变量和局部变量,全局变量(外部变量):函数之外定义的变量,可为本文件中的其他函数所共用 在全部执行过程中都占用存储单元。 一个函数改变了全局变量的值,将影响其他的函数 全局变量与局部变量同名时,全局变量被屏蔽,即不起作用 非必要时建议不用全局变量,全局变量和局部变量,全局变量与局部变量同名示例 int a =3, b=5; int max (int a, int b); void main() int a=8; printf(“%dn”, max(a, b); int max(int a, int b) int c; c= ab ? a:b; return (c); 最后输出结果

4、?,变量的作用域,变量的作用域 变量有效的区域 全局变量:整个程序有效 局部变量 函数内部定义:整个函数 复合语句内:复合语句范围 函数之间的变量:定义处至程序结束,变量的作用域,递归调用,递归调用的形式 一个函数直接或间接的调用该函数本身 int f (int x) int f1 (int x) int y, z; int y, z; z = f(y); z = f2(f1(y); return(2*z); return (2*z); 以上调用均为无终止调用,需要有控制条件,条件满足时结束调用,递归调用,Hannoi塔问题,A,B,C,递归调用,A,B,C,A,B,C,A,B,C,A,B,C

5、,A,B,C,AC,AB,CB,AC,A,B,C,?,n ABC,n-1 ACB,n-1 BAC,学习目标,理解 “指针”的概念; “动态数组”的概念; 掌握 “指针变量”的定义方式; “指针变量”的赋值方式; “指针变量”的使用方式; “动态数组”的定义和使用;,互联网上的资源地址,/images/content/166502.jpg,N49 Nebula,可以把“网址”称为 指向资源的“指针”,内存中的资源地址,0 x0012FF70 0 x0012FF74 0 x0012FF78 0 x0012FF7C 0 x0012FF80 0 x0012FF84,

6、void main( ) int a = 15; int b = 2; int c = 76; int i = 30; int j = 126; int k = 5; ,变量的三要素,变量的地址,变量的值,变量的名字,76,0 x0012FF78,c,内存中的资源地址,/images/content/166502.jpg,N49 Nebula,把某个变量的地址称为“指向该变量的指针”,76,0 x0012FF78,c,变量地址(指针)的作用,计算机通过变量的地址(指针)操作变量,76,0 x0012FF78,c,/imag

7、es/content/166502.jpg,N49 Nebula,我们可以通过资源地址(指针)访问网络资源,变量地址(指针)的作用,计算机通过变量的地址(指针)操作变量,76,0 x0012FF78,c,printf ( “%d”, c ); 找到变量c的地址; 从地址 0 x0012FF78 开始的四个字节中取出数据; 将取出的数据送到显示器;,编译时,编译器建立 变量名 到 地址 的映射,我们能不能拿到、看到地址?,可以利用 取地址运算符“/定义int型变量c,并赋值76; int *pointer; /定义名字为pointer的指针变量; /“*”表示变量pointer的类型为指针类型;

8、 pointer = /将变量c的地址赋值给指针变量pointer; /赋值后,称指针变量pointer指向了变量c,指针变量的“基类型”,int * pointer ;,指针变量的 基类型,指针变量的 名字,指针运算符,76(int型),0 x0012FF78,c,0 x0012FF78,pointer,0 x0012FF90,基类型:指针变量指向的变量的类型,指针变量的“基类型”,问题: 指针变量是用来存放“变量的地址”的; 既然“变量的地址”的格式都一样(VC6中4字节); 为什么还要指定指针变量的“基类型”?,int c = 76;/定义int型变量c,并赋值76; int *poin

9、ter;/定义名字为pointer的指针变量; pointer = /为指针变量赋值;,为何要指定指针变量的“基类型”?,int *pointer1; pointer1 = , ,0 x0012FF70 0 x0012FF71 0 x0012FF72 0 x0012FF73 0 x0012FF74 0 x0012FF75 0 x0012FF76 0 x0012FF77 0 x0012FF78 0 x0012FF79 0 x0012FF7A 0 x0012FF7B,int c = 76;,float i = 3.14;,0 x0012FF75,pointer1,0 x0012FF7A,point

10、er2,指针变量的定义、赋值,定义一个指向int型变量c的指针变量 int *pointer ; pointer = ,能不能写成: int *pointer ; pointer = c ;,绝对不行! 因为pointer是存放地址的变量,所以只能存放地址!,指针变量的使用,问题: 既然指针变量中存放的是“某个变量的地址”; 可否通过“指针变量”访问“它所指向的变量”呢? 例如:,76,0 x0012FF78,c,0 x0012FF78,pointer,0 x0012FF90,可否利用pointer访问到变量c的值“76”呢?,指针变量的使用,则*pointer: 为“pointer所指向的存

11、储单元的内容”; “pointer所指向的存储单元的内容” 是 变量c,若有:,0 x0012FF74 0 x0012FF75 0 x0012FF76 0 x0012FF77 0 x0012FF78 0 x0012FF79 0 x0012FF7A 0 x0012FF7B,int c = 76;, ,0 x0012FF78,pointer,int c = 76; int *pointer = ,可以利用 指针运算符* 实现,指针的使用示例,#include void main( ) int c; int *pointer; c = 76; pointer = ,printf(“%d”,*poin

12、ter); 相当于 printf(“%d”, c); 结果:76,指针的使用示例,#include void main( ) int c; int *pointer; c = 76; pointer = ,可否写成:*pointer = ,问题与回答,指针变量的定义: int *pointer ; pointer = ,指针变量与变量,例如: 若 int *p = ,则: *p = *q 等价于 a = b; a = * q 等价于 a = b; *p = b 等价于 a = b;,程序举例(1),#include void main() int akey = 0, b = 0; int *p

13、 = NULL, *q = NULL; akey = 66; p = ,程序举例(2),#include void main() int *p1, *p2, *p; int a, b; scanf(%d, %d“, ,程序举例(2),#include void main() int *p1, *p2, *p; int a, b; scanf(%d, %d“, ,讨论: * * * 定义一个指向变量a的指针变量pointer int *pointer = ,动态数组的引入,静态数组亦即一般数组的定义 数据类型 数组变量名数组大小; int a10; char c10; 数组大小固定为常量,需要预

14、知数组大小! 如果数组大小不定怎么办? 动态数组!,动态数组,申请空间 头文件 赋值 访问 空间回收,动态数组 申请空间,用前面讲过用如下方法可以定义一个数组: char name20; / 定义一个类型为char长度为20的数组。 在申请动态数组之前,先定义指向动态数组的指针。例如: char *name; 然后,用malloc()函数申请动态数组: name = (char *)malloc(20);,动态数组 头文件,使用前要在文件的开始包含文件。例如: #include void main( ) double *pd; pd = (double *)malloc(sizeof(doub

15、le) * 50); ,动态数组 赋值,int *p; p = (int *)malloc(sizeof(int) * 100); /一百个数组元素,每个元素类型为int *p = 1; / 将数组的第1个元素赋值为0 *(p+1) = 2; / 将数组的第2个元素赋值为1 *(p+2) = 3; / 将数组的第3个元素赋值为2,动态数组 赋值,与静态数组相同,动态数组的元素下标也是从0开始的。所以对上面pi所指的数组可以用如下的循环将全部元素赋初值为0: int j; for(j=0; j100; j+) *(pi+j) = 0;,动态数组 例,在使用动态数组的元素时,可以把每个数组元素看作

16、一个指针,例如: char *pc; /定义字符指针pc pc = (char *)malloc(sizeof(char) * 2); / 两个数组元素,每个元素类型为char *pc = a; / 将数组的第1个元素赋值为a *(pc+1) = b; / 将数组的第2个元素赋值为b char x, y; / 定义字符型变量x和y x = *pc; / 将pc中第一个元素的内容赋值给x; 此时x的值为a y = *(pc+1); / 将pc中第二个元素的内容赋值给y; 此时y的值为b,动态数组 空间回收,静态数组是数组变量定义时分配空间的,它的空间在该变量失效时由系统自动回收。 动态数组是用m

17、alloc()函数动态申请的,需要在程序中调用free()函数主动释放。如: char *pc; /定义字符指针pc pc = (int *)malloc(sizeof(char) * 2); / 两个数组元素,每个元素类型为char free(pc);,动态数组 注意事项,强制类型转换 malloc返回一个void *类型的地址,必须通过强制类型转换,才能赋值给特定的指针变量,如 int *pint = (int *) malloc(.); 使用sizeof() 最好使用“sizeof(类型名)*动态数组长度”形式确定分配内存的大小,如 int *pint = (int *) malloc(

18、sizeof(int)*.); 分配的内存不再使用时一定要释放 free(pint);,动态数组 注意事项,分配失败处理 malloc分配内存不能分配时,返回一个NULL值,可以根据返回值判断内存分配是否成功 int *pint = (int *)malloc(131);if (pint=NULL) printf(“Can not alloc so many memory!”); else printf(“A lot of memory are allocated!”); free(pint); ,动态数组 注意事项,正确释放内存空间 int ints20; int *pint=ints; free(pint); pint = NULL; free(pint); pint = (int *)malloc(sizeof(int)*10); if (pint!=NULL) free(pint); free(pint); ,动态数组示例,字符串复制: 申请空间存放字符串 #include #include #include int main() char str12 = “I am happy”; char *pstr = (char *) malloc(20); strcpy(pstr, str); printf(

温馨提示

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

评论

0/150

提交评论