您的位置:首页 > 编程语言 > C语言/C++

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

2015-07-27 00:33 260 查看
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
一、关键字const

1.const介绍

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

2.const使用的地方

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

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

2)修饰指针

1》int a=10,b=20;

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

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

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

int const * p1 也和上面一样。

2》int *const p

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

3》const int * const p

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

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

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

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

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

二、内存管理

1.内存分区

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

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

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

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

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

2.常见的内存分配函数

1)malloc 函数

格式: void * malloc(ungsigned size);

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

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

#include <stdio.h>

#include <stdlib.h>

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 <stdio.h>

#include <stdlib.h>

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;

}

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

3 野指针及内存泄露

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

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

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

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

四、static和extren

1.static和extrn修饰局部变量

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

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

extren 不能修饰局部变量。

2 static 和extren 修饰全局变量

static 对全局变量的作用

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

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

extern对全局变量的作用

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

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

3 static和extren 对函数的作用

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

extren 声明函数,可以在定义函数文件中使用,也可以在其他文件中使用
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: