黑马程序员------C语言程序 const、static和extren 及内存管理

 ------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

 一、关键字const

    1.const介绍 

    const是一个类型修饰符 使用const可以让变量的值不能改变

    2.const使用的地方

        1)修饰变量  const int a =10; 这时的a不能修改 ,这里a就变成常量了

    指针强制修改 int*p=&a; *p =100; 但是值还是没变 两个的地址是一样。

        2)修饰指针

          1int a=10,b=20;

          const int *p =&a;//p初始化

                p=&b //重新改p的指向

            *p =100//这里是不行的 p指向的变量的值不能修改

            int const * p1 也和上面一样。

        2int *const p 

            这样修饰 是可以改变p指向的变量的值。但是p指向是不能改的

        3const int * const p

                既不能修改p的指向也不能修改指向变量的值

        记忆技巧: 看const 和 *的位置

            如果const在 *的左侧 。表示指向可以修改,指向的变量的值不能修改

            如果const *的右侧,表示指向不能改变,指向的变量的值可以修改

            如果const出现在两侧,表示指针变量的指向和值都不能变。

 二、内存管理

    1.内存分区

        bbs段: 未初始化的全局变量和静态变量

        数据段:已经初始化的全局变量和静态变量,字符串常量等

        代码段: 程序执行代码的一块内存区域

        堆(heap): 动态分配的内存段

        栈(stak):是用户放程序临时创建的局部变量

    2.常见的内存分配函数

     1malloc 函数

       格式: void * malloc(ungsigned size);

        从内存的堆区分配大小为size个字节的连续的内存空间

        如果内存分配成功 返回没存的首地址

#include 

#include 

 

int main(int argc, const char * argv[]) {

//从内存中申请一块内存空间,可以存储4个整数

 //= 赋值,要求等号的左右两侧的类型要一致

 //p中存放的是新申请的内存空间的首地址

 //注意 malloc申请的内存空间,如果不赋值就是垃圾值

 int *p =(int*)malloc(4*sizeof(int)); //16字节

 if (p!=NULL){

 //使用函数malloc申请的空间进行初始化 都是0

 memset(p,48,16);

 //申请成功

 //        *p = 10;

 //        *(p+1)=100;

 //        *(p+2)=1000;

 //        *(p+3)= 10000; //存放四个整数

 }else{

 

 //内存申请失败

 printf("内存申请失败\n");

 

 }

 for (int i =1; i<4; i++) {

 printf("%d\n",*(p++));

 }

 

 return 0;

 }

 

    2)calloc 分配

     //格式 calloc(块数,长度)

 

 #include 

 #include 

 

 int main(int argc, const char * argv[]) {

 //分配了4块,每块内存的长度为4的内存空间

 //他们的地址也是连续的

 int *p =(int*)calloc(4,sizeof(int));// 16个字节

 //calloc可以自动帮我们初始化为0

 // realloc 函数可以给已经存在的空间扩充大小

 realloc(p, 4*sizeof(int));

 //四个内存空间

 

 if (p!=NULL) {

 

 }else{

 //内存分配失败

 printf("内存申请失败\n");

 }

 

 return 0;

 }

  3realloc 给已经分配的内存空间扩大空间

 

 3 野指针及内存泄露

   1.指针没有指向,就是野指针,

 int *p; 这就是也指针 ,如果我们开始不知道这个指针指向谁可以给赋值为空 int*p=NULL;

 

   2.当用malloc calloc 后程序结束后 指针会消失但是内存还存在。没有zz指向这个内存的地址也就无法使用这个内存,这是应该用 free(p);

     这样就释放这个空间,free(p)以后 是个野指针所以需要 P=NULL;

 四、staticextren 

     1.staticextrn修饰局部变量

        static1 修饰局部变量的作用域会得到延长

               定义的变量的代码在整个程序运行期间仅仅会执行一次

        extren 不能修饰局部变量。

    2 static extren 修饰全局变量

        static 对全局变量的作用

           ststic修饰的全局变量,表示该全局变量只能在当前文件使用,不能在其他文件使用

            在不同的文件中 ,使用static可以声明同名变量

        extern对全局变量的作用

            extrn 修饰的全局变量,表示当前变量可以在本文件使用,也可以在其他文件使用(文件存在包含关系)

                extren声明的全局变量在不同的文件中不能同名(两个文件必须有包含关系)

    3 staticextren 对函数的作用

          static 修饰的函数,是一个内部函数(只能在定义的那个文件中去使用)

            extren 声明函数,可以在定义函数文件中使用,也可以在其他文件中使用

 

你可能感兴趣的:(黑马程序员------C语言程序 const、static和extren 及内存管理)