------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
#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;
}
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 声明函数,可以在定义函数文件中使用,也可以在其他文件中使用