c++学习笔记 内存四区 函数调用模型 指针强化
来源:互联网 发布:软件项目质量保证 编辑:程序博客网 时间:2024/06/08 05:38
栈:由编译器自动分配释放,存放函数的参数值,局部变量的值等。
堆:一般由程序员分配释放,若程序员不释放,程序结束时可能由操作系统回收。
数据区:
全局区:全局变量和静态变量的存储是放在一块的,吃实话的全局变量和静态便令在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。
常量区:字符串常量和其他常量的存储位置,程序结束后由操作系统释放。
代码区:存放函数体的二进制代码。
#include<stdio.h>
#include<stdlib.h>
char *getstr1()
{
char *p1 = "abcdef";
return p1;
}
char *getstr2()
{
char *p2 = "abcdef";
return p2;
int main()
{
char *p1 =NULL
char *p2 = NULL;
p1 = getstr1();
p2= getstr2();
printf("%d %d", p1, p2);
}
运行可以看到p1,p2是相等的,abcdef在常量区。
函数调用模型
划出内存四区训练:
01全局区训练
char *p1= “abcdefg”;
02 堆栈区生命周期训练
Char p1[]= “abcdefg”;
void main26()
{
char buf[100];
//byte b1 = new byte[100];
int a = 10; //分配4个字节的内存 栈区也叫临时区
int *p;//分配4个字节的内存
p = &a; //cpu执行的代码,放在代码区
*p = 20; //
{
char *p = NULL; //分配4个字节的内存 栈区也叫临时区
p = (char *)malloc(100); //内存泄露概念
if (p != NULL)
{
free(p);
}
}
system("pause");
}
1、主调函数分配的内存空间(堆,栈,全局区)可以在被调用函数中使用,可以以指针作函数参数的形式来使用
2、被调用函数分配的内存空间只有堆区和全局区可以在主调函数中使用(返回值和函数参数),而栈区却不行,因为栈区函数体运行完之后
这个函数占用的内存编译器自动帮你释放了。
3、一定要明白函数的主被调关系以及主被调函数内存分配回收
2.2指针强化
铁律1:指针是一种数据类型
1) 指针也是一种变量,占有内存空间,用来保存内存地址
测试指针变量占有内存空间大小
2)*p操作内存
在指针声明时,*号表示所声明的变量为指针
在指针使用时,*号表示 操作 指针所指向的内存空间中的值
*p相当于通过地址(p变量的值)找到一块内存;然后操作内存
*p放在等号的左边赋值(给内存赋值)
*p放在等号的右边取值(从内存获取值)
3)指针变量和它指向的内存块是两个不同的概念
//含义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成立的三个条件:
4)引申: 函数调用时,用n指针(形参)改变n-1指针(实参)的值。
//改变0级指针(int iNum = 1)的值有2种方式
//改变1级指针(eg char *p = 0x1111)的值,有2种方式
//改变2级指针的(eg char **pp1 = 0x1111)的值,有2种方式
//函数调用时,形参传给实参,用实参取地址,传给形参,在被调用函数里面用*p,来改变实参,把运算结果传出来。
//指针作为函数参数的精髓。
铁律3:理解指针必须和内存四区概念相结合
1) 主调函数 被调函数
a) 主调函数可把堆区、栈区、全局数据内存地址传给被调用函数
b) 被调用函数只能返回堆区、全局数据
2) 内存分配方式
a) 指针做函数参数,是有输入和输出特性的。
铁律4:应用指针必须和函数调用相结合(指针做函数参数)
编号
指针函数参数
内存分配方式(级别+堆栈)
主调函数
实参
被调函数
形参
备注
01
1级指针
(做输入)
堆
分配
使用
一般应用禁用
栈
分配
使用
常用
Int showbuf(char *p);
int showArray(int *array, int iNum)
02
1级指针
(做输出)
栈
使用
结果传出
常用
int geLen(char *pFileName, int *pfileLen);
03
2级指针
(做输入)
堆
分配
使用
一般应用禁用
栈
分配
使用
常用
int main(int arc ,char *arg[]); 指针数组
int shouMatrix(int [3][4], int iLine);二维字符串数组
04
2级指针
(做输出)
堆
使用
分配
常用,但不建议用,转化成02
int getData(char **data, int *dataLen);
Int getData_Free(void *data);
Int getData_Free(void **data); //避免野指针
05
3级指针
(做输出)
堆
使用
分配
不常用
int getFileAllLine(char ***content, int *pLine);
int getFileAllLine_Free(char ***content, int *pLine);
指针做函数参数,问题的实质不是指针,而是看内存块,内存块是1维、2维。
1) 如果基础类int变量,不需要用指针;
2) 若内存块是1维、2维。
铁律5:一级指针典型用法(指针做函数参数)
一级指针做输入
int showbuf(char *p)
int showArray(int *array, int iNum)
一级指针做输出
int geLen(char *pFileName, int *pfileLen);
理解
主调函数还是被调用函数分配内存
被调用函数是在heap/stack上分配内存
铁律6:二级指针典型用法(指针做函数参数)
二级指针做输入
int main(int arc ,char *arg[]); 字符串数组
int shouMatrix(int [3][4], int iLine);
二级指针做输出
int Demo64_GetTeacher(Teacher **ppTeacher);
int Demo65_GetTeacher_Free(Teacher **ppTeacher);
int getData(char **data, int *dataLen);
Int getData_Free(void *data);
Int getData_Free2(void **data); //避免野指针
理解
主调函数还是被调用函数分配内存
被调用函数是在heap/stack上分配内存
铁律7: 三级指针输出典型用法
三级指针做输出
int getFileAllLine(char ***content, int *pLine);
int getFileAllLine_Free(char ***content, int *pLine);
理解
主调函数还是被调用函数分配内存
被调用函数是在heap/stack上分配内存
铁律8:杂项,指针用法几点扩充
1)野指针 2种free形式
int getData(char **data, int *dataLen);
int getData_Free(void *data);
int getData_Free2(void **data);
2)2次调用
主调函数第一次调用被调用函数求长度;根据长度,分配内存,调用被调用函数。
3)返回值char */int/char **
4)C程序书写结构
商业软件,每一个出错的地方都要有日志,日志级别
铁律9:一般应用禁用malloc/new
- c++学习笔记 内存四区 函数调用模型 指针强化
- c++学习笔记 内存四区 函数调用模型 指针强化
- C语言之指针专题三:理解指针要和内存四区模型和函数调用模型相结合
- C语言之指针专题三:理解指针要和内存四区模型和函数调用模型相结合
- C语言提高之技术模型层次、学习标准、特点、内存四区、函数调用模型
- C语言:内存四区和函数调用模型
- C语言模型:内存四区模型和函数调用模型
- 《C和指针》学习笔记四/函数/
- C/C++学习之C提高----函数调用模型、指针做函数参数、字符串的基本操作、一级指针内存模型建立
- <2> 内存四区和函数的调用模型
- C语言深度剖析学习笔记-指针、数组、内存、函数
- 内存四区模型与指针
- 内存四区模型与指针
- c++学习笔记(四):函数按指针调用和按引用调用
- 【c和指针学习笔记】函数指针的初始化以及函数调用的三种方式
- 笔记:粗略学习c的内存4区及函数调用过程
- 强化C语言的指针类型学习
- 二级指针三种内存模型强化训练
- 读取Java文件到byte数组的三种方式
- 用几何画板怎么制作三维波纹
- 每日一得--mysql函数与存储过程笔记
- 整体二分<QAQ> && CDQ分治
- ubuntu 14.04的rtl8723be无线网卡不稳定
- c++学习笔记 内存四区 函数调用模型 指针强化
- Java追加文件内容的三种方法
- 推送证书无法导出p12文件
- Dumpbin简介
- iOS开发之WWDC2016开发者需要知道的那些事儿
- Integer Break
- iOS-学习-AT&T汇编
- C#程序入门
- Windows下安装并设置Redis