03内存
1.内存
基本概念
-
内存是用用来存储数据的设备。它的存储速度介于寄存器和硬盘之间。
-
内存是CPU唯一可以访问的大容量的存储设备!所有硬盘中的程序和数据必须调入内存之后方可被CPU执行!注意:CPU不能直接处理硬盘中的数据!
-
内存的问题是软件开发中最核心的问题之一!如:内存的分配,内存的释放,内存什么时候分配和释放,谁来分配和释放,分配在哪些地方,访问权限如何!
-
内存是多字节组成的线性一维存储空间
-
内存的基本划分单位是字节
-
每个字节含有8位。每一位存放1个0或者1个1
-
字节和编号是一一对应的。每个字节都有唯一确定的编号,一个编号对应一个字节!这个编号也叫地址
-
一个系统所能管理的内存空间的大小取决与参与编号的二进制位数!
1.DOS系统20位寻址方案,可控制2^20B为1MB的内存
2.386/486系统采用三字节编制,可寻址2^24M即16M的内存
3.奔腾寻址空间32位,其有效寻址空间为2^32M即4GB
软件运行与内存关系(垃圾数据)
内存是在操作系统的统计管理下使用的!
-
软件在运行前需要向操作系统申请存储空间,在内存空间足够时,操作系统将分配一段内存空间并将外存中软件拷贝一份存入该内存空间中,并启动该软件的运行!
-
在软件的运行期间,该软件所占空间不再分配给其他软件
-
当软件运行完毕后,操作系统将回收该内存空间(操作系统不会清空该内存空间中遗留下来的数据),以便再次分配给其他软件使用。
总结:
-
一个软件所分配的空间中极有可能存在着以前其他软件所使用过后的残留数据,这些数据被称之为垃圾数据。所以通常情况下我们为一个变量,为一个数组,分配好存储空间之后都要对该内存空间初始化!
int i = 10; int *p = &i;//int *p; p = &i;
- p存放了i的地址,所以我们说p指向i
- *pj的值就是i
注意:
- 指针变量也是变量,只不过它存放的不能是内存单元的内容,只能存放内存单元的地址,普通变量前不可加*且常量和表达式前不能加&
-
被调函数通过修改主调函数中普通变量的值
- 实参为相关变量的地址
- 形参为以该变量类型为类型的指针变量
- 在被调用函数中以 *形参变量名 的方式就可以修饰主函数相关的值
指针和数组
-
指针和一维数组
-
数组名:
- 一维数组名是个指针常量
- 它存放的是一维数组第一个元素的地址
- 它的值不能改变
- 一维数组名指向数组的第一个元素
-
下标和指针的关系
- a[i] 等价*(a+i)
# include <stdio.h>
void f(int *i)//并非定义了一个名字叫做*i的形参,而是定义一个形参,该形参名字叫i
{
*i = 100;
}
int main(void)
{
int i = 9;
f(&i);//传入i的地址
print("i = %d\n",i);
return 0;
}
# include <stdio.h>
int main(void)
{
int a[5] = {1,2,3,4,5};
a[3] == *(3+a);
printf("%p\n", a+1);
printf("%p\n", a+2);
printf("%p\n", *a+3);//*a+3等价于a[0]+3
return 0;
}
# include <stdio.h>
void Show_Array(int *p,int len)
{
int i = 0;
p[0] = -1; //p[0]==*(p+0)==*p==a[0],所以p[0]==a[0]
//p[i]就是主函数的a[i]
for(i=0; i<len; ++i)
printf("%d\n", p[i]);
}
int main()
{
int a[5] = {1,2,3,4,5};
Show_Array(a,5); //a == &a[0],&a[0]本身是int *类型
printf("%d\n",a[0]);
return 0;
}
指针变量的运算
假设指针变量的名字为p,p+i 的值是p+i*(p所指向变量所占字节数)
- 指针变量不能相加,不能相乘,不能相除
- 如果两指针变量属于同一数组,则可以加减一整数,前提是最终结果不能超过指针所指数组的长度
- p+i的值是p+i*(p所指向变量所占字节数)
- p-i的值是p-i*(p所指向的变量所占的字节数)
- p++ == p+1
- p-- == P-1
例题:
如何通过被调用函数修改主调函数中一维数组的内容【如何界定边界】
- 两个参数 存放数组首元数的指针变量 存放数组元素长度的整型变量
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人