Linux C语言:指针与内存

1 . 计算机中的数据表示方法

单位:字节(byte)
1byte = 8 bit

计算用二进制
显示为十进制
编程为十六进制

2 . 内存管理

Q : 32位系统 最大使用4G内存?
A : 32位系统,地址总线是32位,也就是寻址空间是32位;
32位指的是:给内存编号只能编到32个二进制位;
32根地址总线就是232个状态;
232 = 210 *210 *210 *4=1k * 1k * 1k *4=1M * 1k *4=4G

64位系统可以管理264(4G*4G)的内存
地址从0x0000 0000 0000 0000 到 0xFFFF FFFF FFFF FFFF
任意一个地址可以储存1个字节也就是8位2进制

在这里插入图片描述

其中,代码放在 代码段;
全局变量、常量、静态变量放在 数据段;
局部变量放在 栈;

3 . 变量和指针的本质

变量的本质是什么?
变量名它只是一个代号,代表一个内存地址空间
变量的本质就是内存
C语言无法对某个内存进行直接操作

指针也是变量,保存的就是内存地址
指针的本质就是地址

4 . 操作系统对内存的管理

32bit操作系统 : 指针4个字节
64bit操作系统 : 指针8个字节
只要是地址,不管指向什么类型,所占字节数都是相同的,指向函数地址也是一样。

5 . 函数栈以及数据段内存

最先分配的栈地址最大,从栈顶向下分配;

栈的特点:先进后出:
在这里插入图片描述
如图所示,先调用的main函数,然后调用的quadrate函数,最后进入rect函数,而最后进入的rect函数在最上边。

扫描二维码关注公众号,回复: 9368978 查看本文章

不同函数里面的同名静态变量地址不同,相互独立;
补充:
1、静态存储变量通常是在变量定义时就分定存储单元并一直保持不变,直至整个程序结束。(static)
2、而动态存储变量是在程序执行过程中,使用它时才分配存储单元,使用完毕立即释放。(普通的int/char等,所以在 栈 中)

6 . 函数指针与指针指向的数据访问

int (*pquadrate)(int a)=&quadrate;

将pquadrate声明为函数指针,它指向的是 (有一个int型参数,返回值为int的) 函数。参数就是int a,返回值是int型。

int s = (*pquadrate)(a);

gdb调试的时候运行到这一行的时候也可以按s进入函数,说明函数指针也可以调用一个函数,经常用作回调函数使用。
*pquadrate是去指针里的具体值(也就是调用函数),后面那个a(前面已经声明了 int a=3)是调用函数时用的参数;

p *pa
如果pa指针指向的是栈内存,堆内存,数据内存,则输出地址的具体的值,
如果pa指针指向的是代码内存,则为调用函数;

发布了30 篇原创文章 · 获赞 36 · 访问量 687

猜你喜欢

转载自blog.csdn.net/qq_42745340/article/details/103871560