0422学习总结(内存、指针、关键字)

1.内存管理
c语言中的程序和函数都是加载到内存中运行,加载到物理内存,应用程序显示虚拟内存,OS管理内存。

2.内存分为哪些东西:
(1)栈空间:局部变量(a,b),函数的形参(fun(int a,int b)),自动变量(auto修饰的变量)
特点:1.os自动分配和释放
 2.可以重复使用
 3.有大小
 nlimit -a|grep stack查看栈空间的大小
 4.栈空间是脏的,要求定义变量需要初始化
 5.临时性:用完后直接释放(函数里不能返回局部变量的地址)
 6.因为栈空间有大小,不停的分配,会溢出,报段错误
 7.递归调用可能会出现栈溢出
    (2)堆空间:malloc,calloc,ralloc
例子:int *p = NULL;
 p=(int *)malloc(sizeof(int));
 .....
 free(p);
使用步骤:1、用malloc等函数分配一段堆空间
 2、让指针指向分配的堆空间
 3、使用
 4、释放,如果不释放,别的程序想分配堆空间时,现在占用的堆空间将不会再分配(内存泄露)
特点:1.手动分配,需要自己写程序来分配和释放
 2.重复利用
 3.堆空间也是脏的
 4.临时性


3.malloc、calloc、ralloc的区别
内存空间链表:(分配原理)
20个字节的内存,遍历内存空间链表,找到一个>=20字节的空间,然后把它摘出来使用,25个字节,剩余的5个字节再放到内存空间链表上(容易造成内存碎片化)
(void *)malloc(大小):分配成功返回是分配的堆空间的第一个字节的地址,分配失败:NULL
void*:空类型,万能指针
大小:malloc(sizeof(int))这是考虑代码的可移植性
malloc:大小不能改变,里面没有初始化
calloc:定义的时候,里面的值被初始化为0
ralloc:可以改变分配空间的大小:ralloc(p,50)
常用的是malloc: malloc(4) gcc中分配的时候是以16个字节为单位


4.内存中的各个段
.text:代码段,保存的是程序函数
char *p = "linux" 字符串常量,也是放在这里
.data:数据段,保存的是全局变量,静态变量(显示初始化为非0的静态变量:static int a=0)
.bss:保存的是静态变量,显示初始化为0或者没有初始化的静态变量,如果初始化自动的初始化。

总结:既然定义的变量放在内存中的那些地方,以后要考虑如何定义局部、全局、static变量
1.如果只是想让变量只有函数中有效,那么就定义局部变量,跟生命周期有关
2.堆空间和.data没有本质上的区别,生命周期不一样

5.几个重要的关键字
(1)register:寄存器变量,告诉编译器register会经常调用,请求编译器将这些变量保存到cpu内部的寄存器上,不是命令,因为寄存器有限
目的:提高调用效率
注意:1.引用这些变量时,因为有可能不是保存在内存中,所以不能取地址
 2.要求register变量类型能够被CPU所接受,register大多数是<=int型变量,但是有有些机器也可以是浮点型
 3.只能修饰局部变量
(2)static:静态变量
功能:1.对局部变量来说,可以延长局部变量的生命周期,可以让局部变量保存上一次调用的值
 2.隐藏作用
修饰:1.全局变量,局部变量,函数
 2.修饰全局变量时,让局部变量只能够在这个.c中调用
 3.修饰函数,同上
static修饰的局部变量和全局变量的区别
因为全局变量在本次.c中能够调用,会带来同步问题
同时只有一个程序对变量进行操作
注意:少用全局变量,都有局部变量
(3)extern:外部声明
a.c中定义的函数,如果要在b.c中调用,extern fun1()
(4)volatile:防止预编译
(5)const:与指针连用

6.指针
本质:就是一个变量,但是保存的是地址
(1)定义,格式:类型名 *指针变量的名字//int *p
指针类型和指针指向的类型
指针类型:把指针的名字去掉,剩下的就是指针的类型
指针指向的类型:比如int *p中的int
(2)初始化:1.int *p; p = &a;
2.int *p = NULL;
3.int *p = &a;
(3)引用1.&:AND取地址
&a:a的地址
2.*:(1)定义的时候表面指针变量8
 (2)取值运算符  //*p = 12
 
7.指针能够进行什么操作
1.指针和变量
2.指针和数组
(1)指针指向数组,数组指针
(2)数组里保存指针,指针数组
(3)用数组名指向指针,数组名代表首元素的地址
(4)a[i] = *(a+i)
3.二维数组
二维数组的数组名代表一维数组的首元素地址
a[i][j]=a[i]+j      *(a[i]+j)取值
小结:(1)找到某一行
 (2)找到某一行的某一列
 (3)取值*(a[i]+j)
*[] = *()
*(a[i]+j) = *(*(a+i)+j)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值