【C语言】第八篇·内存管理和结构体

来源:互联网 发布:恒生指数期货模拟软件 编辑:程序博客网 时间:2024/05/22 14:24

一、const 关键字
    1.概述:const是一个类型修饰符,使用const关键字修饰变量可以使变量的值不能被改变。常类型是指被类型修饰符const说明的类型,常类型修饰的变量或者对象的值是不能被更新的。
   2.作用:
     1)可以定义const常量,具有不可变性。
         例如:const int Max = 10; intarry[Max];
     2)便于进行类型检查,使编译器对处理内容有更多的了解,消除一些隐患。
     3)可以避免意义模糊的数字出现,同样可以很方便的对参数进行修改和调整。
         例如:修改1)中Max的值:const int Max=11;
     4)可以保护被修饰的东西,防止被意外修改,增强程序的健壮性。

二、内存管理
   1.概念:软件运行时对计算机内存和资源的分配和使用技术。其主要目的是如何高效、快速分配,并在适当的时候释放和回收内存资源。
   2.内存分配方式:
     1)从静态存储区域分配。内存在程序编译时就已经分配好,这块内存在整个程序运行期间都存在。例如:全局变量、static变量
     2)在栈上创建。在执行函数时,函数内局部变量的存储单元可以在栈上创建,当函数执行结束时这些存储单元自动被释放。
     3)从堆上分配,亦称动态内存分配。在程序运行时用malloc或new申请任意大小的内存空间,程序员自己负责在何时用free或delete释放内存。
    3.内存分区
   
    BSS段:用来存放未初始化的全局变量和静态变量。
    数据段:用来存放程序中已经初始化的全局变量和静态变量的内存区域。属于静态内存分配,可分为只读和读写数据段。字符常量一般放在只读数据段中。
   代码段:用来存放程序执行代码的一块内存区域。这部分区域在程序运行前就已经确定,并且内存区域属于只读。
   堆:用于存放程序运行时动态分配的内存段,它的大小不固定,而且可以扩张。malloc申请,free释放。
   栈:又称堆栈。存放用户临时创建的局部变量。
    4.常见的内存分配函数
     1)malloc
         (1)使用方法:void *malloc(unsignedsize),size:分配内存的字节
         (2)包含库函数stdlib.h
        (3)作用:内存的堆区分配一个大小为size的连续空间。如果分配成功,返回新分配空间的首地址,否则,返回NULL。
                例如:int *p;   p=(int*)malloc(sizeof(int));    if(p != NULL) { // 需要执行的语句}
        (4)malloc申请的内存空间,不进行初始化,那么里面的数据是垃圾数据。
     2)calloc
        (1)使用方法:calloc(块数,每块的长度)
        (2)包含库函数 stdlib.h
        (3)int *p=(int *)calloc(4,sizeof(int)); //16字节连续空间
     3)relloc
        (1)作用:给已经存在的空间扩充大小
        (2)用法:int *p=(int*)calloc(4,sizeof(int));  p =relloc(p,40*sizeof(int))
        (3)注意:当在先前申请好的地址下存在并且足够40字节空间,则直接分配连续空间。不存在时,找一块存在44个字节的内存空间,将先前的4字节复制到新的空间。

三、构造类型
   1.概念:构造数据类型是根据已定义的一个或多个数据类型用构造的方法来定义的。即:一个构造类型的值可以分解为若干个“成员”或“元素”。每个成员都是一个基本的数据类型或又是一个构造类型。
   2.分类:数组类型,结构体类型,公用体类型
   3.结构体:一种构造类型,由若干个成员组成,每个成员都是一个基本的数据类型或又是一个构造类型。
   4.为什么用结构体:结构体可以把功能相同的数据组织起来。存在一起,用的时候方便,在函数调用时传递参数较多使用结构体简单而且方便。
   5.定义结构体的方法:
      struct 结构名{  成员列表};
      例如:定义一个学生结构体
       struct student{
                              charname[20];
                              intage;
                              floatscore;
                          };
     6.定义结构体变量:
     1)定义结构体时定义
       struct student{
                              charname[20];
                              intage;
                              floatscore;
                          }stu1;
     2)结构体定义完成后定义
         structstudent stu2;
     3)使用匿名结构体定义变量
       struct student{
                              charname[20];
                              intage;
                              floatscore;
                          }stu3;
   6.结构变量中成员访问方法
      结构变量名.成员名  例如:stu3.name
   7.结构体变量成员初始化
     1)定义时初始化
     2)定义完后初始化
        例如:stu3={"Liming",21,63.2f};
   8.结构体存储原理
      结构名表示一个结构形式,编译系统并不对它分配内存空间。只有当某变量被说明为该结构类型时,才对变量分配内存空间。
      结构体占用的内存空间是每个成员占用字节数之和(考虑对齐问题)。
    9. 示例程序:
程序一:

/* 1)利用结构体,计算学生的平均成绩和不及格人数 2)打印80到100分学生成绩和姓名*/#include <stdio.h>void main(){float sum=0;int count=0,i;struct student{int num;char *name;char sex;float score;};struct student stu[5]={{101,"Li ping",'F',45},{102,"Zhang ping",'F',62.5},{103,"He fang",'F',92.5},{104,"Cheng ling",'M',87},{105,"Wang ming",'M',58}};for(i=0;i<5;i++){sum = sum + stu[i].score;if(stu[i].score < 60){count++;}else if(stu[i].score >= 80 && stu[i].score <= 100){printf("成绩大于80小于100的人:\n姓名:%s 成绩:%.2f\n",stu[i].name,stu[i].score);}}printf("平均成绩:%.2f\n不及格人数:%d\n",sum/5,count);}




程序二:通讯录

#include <stdio.h>#define Len 5void main(){int i;struct contact{char name[20];char num[11];}contacts[Len];printf("请输入联系人信息,格式:姓名 电话\n");for(i=0;i<Len;i++){ scanf("%s %s",contacts[i].name,contacts[i].num);}for(i=0;i<Len;i++){printf("姓名:%s 电话:%s\n",contacts[i].name,contacts[i].num);}}





0 0
原创粉丝点击