内容发布更新时间 : 2024/11/6 7:30:46星期一 下面是文章的全部内容请认真阅读。
欢迎阅读
4、数据类型和变量的关系 ? 通过数据类型定义变量 5、总结及思考题
1 对内存,可读可写;2通过变量往内存读写数据;3 不是向变量读写数据,而是向变量所代表的内存空间中写数据。问:变量跑哪去了?
思考1:变量三要素(名称、大小、作用域),变量的生命周期? 思考2:C++编译器是如何管理函数1,函数2变量之间的关系的? ====》引出两个重要话题: 内存四区模型 函数调用模型 重要实验: int main333() { // //2种方法,通过变量直接操作内存 // 通过内存编号操作内存 int i = 0; printf(\ *((int *)(1245024)) = 10; printf(\ printf(\ getchar(); return 0; }
1.3.3程序的内存四区模型 内存四区的建立流程 流程说明 1、操作系统把物理硬盘代码load到内存 2、操作系统把c代码分成四个区 3、操作系统找到main函数入口执行 各区元素分析 1.4函数调用模型 1.4.1基本原理
1.4.2内存四区模型和函数调用模型变量传递分析
1、一个主程序有n函数组成,c++编译器会建立有几个堆区?有几个栈区?
2、函数嵌套调用时,实参地址传给形参后,C++编译器如何管理变量的生命周期? 分析:函数A,调用函数B,通过参数传递的变量(内存空间能用吗?) 1.4.3提示学好C语言的关键
1.4.4如何建立正确的程序运行内存布局图
? 内存四区模型&函数调用模型 欢迎阅读
欢迎阅读
? 函数内元素
? 深入理解数据类型和变量“内存”属性 ? 一级指针内存布局图(int *,char*) ? 二级指针内存布局图(int ** char **)
? 函数间
? 主调函数分配内存,还是被调用函数分配内存
? 主调函数如何使用被调用函数分配的内存(技术关键点:指针做函数参数)
======》学习指针的技术路线图 1.5内存四区强化训练 01全局区训练 ? char *p1= “abcdefg”; 02 堆栈区生命周期训练 ? Char p1[]= “abcdefg”; ? 返回基本类型 ? 返回非基本类型 03堆栈属性训练 ? 测试heap生长方向 ? 测试stack生长方向 ? Heap、stack生长方向和内存存放方向是两个不同概念 ? 野指针 ? Malloc得到指针释放问题测试 ? free(p) ? free(p+1),深入理解 1.6作业强化 训练1划出内存四区 void main26() { char buf[100]; //byte b1 = new byte[100]; int a = 10; //分配4个字节的内存 栈区也叫临时区 int *p;//分配4个字节的内存 p = &a; //cpu执行的代码,放在代码区 欢迎阅读
欢迎阅读 } 全局区代码测试 char * getstring1() { } char * getstring2() { } void main() { int i= 0; //指针指向谁就把谁的地址赋给指针变量。 char *p1 = getstring1(); char *p2 = getstring2(); char ******* p3 = NULL; //p3 是个变量 //指针变量和它所执行的内存空间变量是两个不同的概念 char *p2 = \return p2; char *p1 = \return p1; *p = 20; // { } system(\char *p = NULL; //分配4个字节的内存 栈区也叫临时区 p = (char *)malloc(100); //内存泄露概念 if (p != NULL) { } free(p); 欢迎阅读
欢迎阅读 } 训练2 划出内存四区 void main01() { } 2指针知识体系搭建 2.1前言 先从整体上把握指针的知识体系。然后突破1级指针、二级指针、多级指针。 2.2指针强化
铁律1:指针是一种数据类型 欢迎阅读
char buf[100]; //byte b1 = new byte[100]; int a = 10; //分配4个字节的内存 栈区也叫临时区 int *p;//分配4个字节的内存 p = &a; //cpu执行的代码,放在代码区 *p = 20; // { } system(\char *p2 = NULL; //分配4个字节的内存 栈区也叫临时区 p2 = (char *)malloc(100); //内存泄露概念 if (p2 != NULL) { } if (p2 != NULL) { } free(p2); free(p2); //p2 = NULL; 若不写,实验效果,分析原因 strcmp(p1, p2); system(\欢迎阅读
1) 指针也是一种变量,占有内存空间,用来保存内存地址
测试指针变量占有内存空间大小 2)*p操作内存
在指针声明时,*号表示所声明的变量为指针
在指针使用时,*号表示 操作 指针所指向的内存空间中的值
*p相当于通过地址(p变量的值)找到一块内存;然后操作内存 *p放在等号的左边赋值(给内存赋值) *p放在等号的右边取值(从内存获取值) //含义1 给p赋值p=0x1111; 只会改变指针变量值,不会改变所指的内容;p = p +1; //p++ //含义2 给*p赋值*p='a'; 不会改变指针变量的值,只会改变所指的内存块的值 //含义3 =左边*p 表示 给内存赋值, =右边*p 表示取值 含义不同切结! //含义4 =左边char *p //含义5 保证所指的内存块能修改 4)指针是一种数据类型,是指它指向的内存空间的数据类型 含义1:指针步长(p++),根据所致内存空间的数据类型来确定 p++=?(unsigned char )p+sizeof(a); 结论:指针的步长,根据所指内存空间类型来定。 注意: 建立指针指向谁,就把把谁的地址赋值给指针。图和代码和二为一。 不断的给指针变量赋值,就是不断的改变指针变量(和所指向内存空间没有任何关系)。 铁律2:间接赋值(*p)是指针存在的最大意义 1)两码事:指针变量和它指向的内存块变量 2)条件反射:指针指向某个变量,就是把某个变量地址否给指针 3)*p间接赋值成立条件:3个条件 a)2个变量(通常一个实参,一个形参) b) 建立关系,实参取地址赋给形参指针 c) *p形参去间接修改实参的值 Int iNum = 0; //实参 int *p = NULL; p = &iNum; iNum = 1; *p =2 ; //通过*形参 == 间接地改变实参的值 *p成立的三个条件: 3)指针变量和它指向的内存块是两个不同的概念 4)引申: 函数调用时,用n指针(形参)改变n-1指针(实参)的值。 //改变0级指针(int iNum = 1)的值有2种方式 欢迎阅读