C语言课件:第15讲C语法专题I_第1页
C语言课件:第15讲C语法专题I_第2页
C语言课件:第15讲C语法专题I_第3页
C语言课件:第15讲C语法专题I_第4页
C语言课件:第15讲C语法专题I_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

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

文档简介

1、第15讲 C语法专题I,专题1:内存分配详解 专题2:指针、数组与函数 专题3:位运算符,1,内存区间的划分,变量和对象在内存中的分配都是编译器在编译程序时安排好的,这带来了极大的不便。例如,数组必须大开小用,指针必须指向一个已经存在的变量或对象。 动态内存分配解决了这个问题! C/C+定义了4个内存区间:代码区、全局变量与静态变量区、局部变量区(栈)和动态存储区(堆heap,或叫自由存储区)。,2,代码区,全局数据区,局部数据区,自由存储区,(栈),(堆),系统分配,编程者进行管理,系统分配,系统分配,静态与动态存储分配的区别,全局数据区:全局变量、static变量,编译时预分配好内存,在程

2、序的整个运行期间都存在。 栈:函数内部的局部变量、返回值,函数执行时,创建存储单元,函数执行结束时内存被自动释放。 堆:程序运行时,由malloc等建立内存单元,然后由free来释放。动态内存的生存期由程序员决定。- 动态内存分配,3,动态内存分配函数,typedef unsigned int size_t; malloc函数 void *malloc(size_t size); calloc函数 void *calloc(size_t n, size_t size); realloc函数 void *realloc(void *ptr,size_t size); free函数 void fr

3、ee(void *ptr); C+: new/delete,4,举例说明,例1:使用malloc函数分配一个可以容纳10个整型元素的内存空间,并将其用作一个整型数组。,5,关键代码: int * array; array = (int *) malloc (10 * sizeof(int); 注意:待分配内存大小不能写成数组元素的个数。,举例说明,例2:定义一个结构,使用malloc函数分配一个此种结构类型的对象。 struct test int a; char b; int c10; ;,6,关键代码: struct test * p; p = (struct test *)malloc(s

4、izeof(struct test);,注意问题,malloc函数是一个库函数,包含在头文件stdlib.h中,精简指令的平台不能使用该函数,如多数单片机系统。 指针类型转换是必须的,关系到分配的内存块的大小,由指针类型决定。 内存块大小的可移植性问题。 malloc分配一个整型变量数组,内存大小决定于参数: 数组元素个数n * sizeof(int) calloc分配一个整型变量数组,内存大小决定于双参数: n, sizeof(int) 思考:sizeof 和 strlen函数的区别?,7,一维数组的动态创建(malloc),例1:使用malloc函数分配一个可以容纳10个浮点型元素的内存空

5、间,并将其用作一个浮点数组。,8,float * array; int i, n = 10; array = (float *) malloc (n * sizeof(float); for(i=0;in;i+) arrayi = i; printf(“%4.1f”, arrayi); printf(“n”);,/ scanf(“%f”, array+i);,scanf(“%f”, ,/ printf(“%4.1f”, *(array+i) );,float *NewArray(int n) ,return array; ,一维数组的动态删除(free),9,float * array; ar

6、ray = (float *) malloc (n * sizeof(float); / 对数组进行赋值并输出的操作 free(array); array = NULL;,array = NewArray(n);,void FreeArray(float * array) ,二维数组的动态创建与删除,例2:使用malloc函数分配一个可以容纳5*10个浮点型元素的内存空间,并将其用作一个二维浮点数组。,10,float *p;/ 二维数组首指针 int m, n;/ 行、列可变 scanf(“%d %d”, / 释放二维数组的内存空间,float *Myllocate(int m, int n

7、);,11,二维数组的动态创建(malloc),float *Myllocate(int m, int n) int i; float *p = (float *)malloc(m*sizeof(float *); for (i=0;im;i+) pi = (float *) malloc (n * sizeof(float); / todo: 元素赋值、输出 return p; ,pi = NewArray(n);,*(p+i),二维数组的动态删除(free),void De_Myllocate(float *p, int m);,12,void De_Myllocate(float *p,

8、 int m) int i, j; for (i=0;im;i+) free ( pi ); pi = NULL; free(p); p = NULL: ,*(p+i),二维数组的动态创建与删除示意,13,float *,float *,第15讲 C语法专题I,专题1:内存分配详解 专题2:指针应用详解 专题3:位运算符,14,指针与数组,指针变量 float *pointer_1; 指针变量名是pointer_1 ,而不是* pointer_1 。 指向数组的指针 是数组名,是指向数组元素的指针变量,其初值。 引用一个数组元素,可以用: ) 下标法,如 、p形式; ) 指针法,如 *()或

9、*()。,15,指针与数组,指针变量 float *pointer_1; 指针变量名是pointer_1 ,而不是* pointer_1 。 指向数组的指针 是数组名,是指向数组元素的指针变量,其初值。 引用一个数组元素,可以用: ) 下标法,如 、p形式; ) 指针法,如 *()或 *()。,16,“”和“*”运算符说明,如果已执行赋值语句 pointer_a ; * pointer_的含义是什么? “”和“*”两个运算符的优先级别相同; 按自右而左方向结合:先进行* pointer_的运算,即变量a,再执行运算; * pointer_与a 相同,即变量a的地址; 如果有 pointer_2

10、 * pointer_1,它的作用是将a(a的地址)赋给pointer_2 ,如果pointer_2原来指向b,经过重新赋值后它已不再指向b了,而指向了a。,17,“”和“*”运算符说明,*的含义是什么? 先进行运算,得的地址,再进行*运算,即所指向的变量,也就是变量a。 *和*pointer_的作用是一样的,它们都等价于变量。 (*pointer_)+相当于a+ 注意:括号是必要的; 没有括号,相当于 *(pointer_+) ,+和*为同一优先级别,结合方向为自右而左; 由于+在pointer_1的右侧,是“后加”,即先对pointer_的原值进行*运算,得到的值,然后使pointer_的

11、值改变,这样pointer_不再指向了。,18,指针与函数返回值,返回值为指针的函数 一个函数可以返回一个整型值、字符值、实型值等,也可以返回指针型的数据,即地址。 函数一般声明格式: 类型名 *函数名(参数表列); int *a( int x, int y ); 避免值传递(复制数据)。 文件指针 FILE *fp; 链表头指针 Node *head;,19,与指针相关,指针数组 指针是变量,也可以像其他变量一样存储在数组中。 float *pf10; char *name = Follow me,BASIC,Great Wall,FORTRAN, Computer design; 指向指针

12、的指针 指向一个二维数组的指针 改变指针指向的对象时使用 指向函数的指针(*_p102) 函数指针变量常用用途之一是把指针作为参数传递到其他函数。 类型名 (*函数名)(参数表列);,20,有关指针的数据类型小结,21,指针运算小结,指针变量加(减)一个整数 、等。 指针变量赋值 将一个变量地址赋给一个指针变量,例如: ; 将变量的地址赋给) array; 将数组array 首元素地址赋给。 array; 将数组array第个元素的地址赋给 ;p1 和p2都是指针变量,将p2的值赋给p1 max; max为已定义函数的名称,将函数的入口地址赋给,22,指针运算小结,指针变量可以有空值,即指针变

13、量不指向任何变量 可以这样表示: = NULL; 两个指针变量可以相减 若两个指针变量都指向同一个数组中的元素, 则两个指针变量值之差是两个指针之间的元素个数。 两个指针变量比较 若两个指针变量指向同一个数组中的元素,则可以进行比较。 指向前面的元素的指针变量“小于”指向后面元素的指针变量。,23,void 指针类型,ANSIC新标准增加了一种“void”指针类型,即可定义一个指针变量,但不指定它具体指向哪一种数据类型。 ANSIC标准规定,用动态存储分配函数返回的void指针,用来指向一个抽象类型的数据,在将它的值赋给另一个指针变量时要进行强制类型转换,变量类型具体化。 将一个函数定义为vo

14、id *类型: void *fun (char ch1, char ch2) 表示函数fun返回的是一个地址,它指向“空类型”; 如果需要引用此地址,也需要进行类型转换,例如: p1 = (char *) fun(ch1, ch2);,24,char *p1; void *p2; p1 = (char *) p2 ;,第15讲 C语法专题I,专题1:内存分配详解 专题2:指针应用详解 专题3:位运算符,25,位运算符概况,C语言提供6个位操作运算符: &按位与(AND) |按位或(OR) 按位异或(XOR) 右移 按位求反(一元运算符) 位运算符只能作用于整型操作数,即带符号或无符号的char、short、int与lo

温馨提示

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

评论

0/150

提交评论