1、Note
1) 主调函数 被调函数
a主调函数可把堆区、栈区、全局数据内存地址传给被调用函数被调用函数只能返回堆区、全局数据
2) 内存分配方式
指针做函数参数,是有输入和输出特性的。
2、应用指针必须和函数调用相结合(指针做函数参数)--important
编号 | 指针函数参数 内存分配方式(级别+堆栈) | 主调函数 实参 | 被调函数 形参 | 备注
| ||||
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) 如果基础类int变量,不需要用指针;
2) 若内存块是1维、2维。
3、一二三级指针的经典用法
一级指针典型用法(指针做函数参数)
一级指针做输入int showbuf(char *p)
int showArray(int *array, int iNum)
一级指针做输出
int geLen(char *pFileName, int *pfileLen);
理解
主调函数还是被调用函数分配内存
被调用函数是在heap/stack上分配内存
二级指针典型用法(指针做函数参数)
二级指针做输入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上分配内存
三级指针输出典型用法
三级指针做输出int getFileAllLine(char ***content, int *pLine);
int getFileAllLine_Free(char ***content, int *pLine);
理解
主调函数还是被调用函数分配内存
被调用函数是在heap/stack上分配内存
4、杂项,指针用法几点扩充
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程序书写结构
商业软件,每一个出错的地方都要有日志,日志级别