传智播客_C提高讲义 下载本文

内容发布更新时间 : 2024/5/3 20:27:44星期一 下面是文章的全部内容请认真阅读。

欢迎阅读

//改变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 2.3接口封装设计思想引导

基于socketclient客户端接口设计与实现(仿真模拟) 2.4附录

【王保明老师经典语录】

1)指针也是一种数据类型,指针的数据类型是指它所指向内存空间的数据类型

欢迎阅读

欢迎阅读 2)间接赋值*p是指针存在的最大意义? 3)理解指针必须和内存四区概念相结合? 4)应用指针必须和函数调用相结合(指针做函数参数) 指针是子弹,函数是枪管;子弹只有沿着枪管发射才能显示它的威力;指针的学习重点不言而喻了吧。接口的封装和设计、模块的划分、解决实际应用问题;它是你的工具。 5)指针指向谁就把谁的地址赋给指针? 6)指针指向谁就把谁的地址赋给指针,用它对付链表轻松加愉快 7)链表入门的关键是分清楚链表操作和辅助指针变量之间的逻辑关系 8)C/C++语言有它自己的学习特点;若java语言的学习特点是学习、应用、上项目;那么C/C++语言的学习特点是:学习、理解、应用、上项目。多了一个步骤吧。 9)学好指针才学会了C语言的半壁江山,另外半壁江山在哪里呢?你猜,精彩剖析在课堂。 10) 理解指针关键在内存,没有内存哪来的内存首地址,没有内存首地址,哪来的指针啊。 3字符串和一级指针内存模型专题 3.1字符串基本操作 字符数组初始化方法 int main11() { //1 大{}号法 初始化列表 //数组初始化有2种方法 默认元素个数、指定元素个数 char buf1[] = {'a', 'b', 'c', 'd', 'e'}; //若没有指定长度,默认不分配零 //若指定长度,不够报错;buf长度多于初始化个数,会自动补充零 char buf2[6] = {'a', 'b', 'c', 'd', 'e'}; char buf3[6] = {'a', 'b', 'c', 'd', 'e'}; //char buf4[5] = {'a', 'b', 'c', 'd', 'e'}; printf(\ system(\} 在C语言中使用字符数组来模拟字符串 C语言中的字符串是以’\\0’结束的字符数组 C语言中的字符串可以分配于栈空间,堆空间或者只读存储区 //在C语言中使用字符数组来模拟字符串 //C语言中的字符串是以’\\0’结束的字符数组 欢迎阅读

欢迎阅读 //C语言中的字符串可以分配于栈空间,堆空间或者只读存储区 int main12() { //1 用字符串来初始化数组 char buf2[] = {'a', 'b','c','d','\\0'}; //2 字符串常量初始化一个字符数组 char buf3[] = {\//结论:会补充零 char buf4[] = \ char buf5[100] = \ printf(\ printf(\ printf(\} //strlen()求字符串的长度,注意字符串的长度不包含\\0 //sizeof(类型)字符串类型,的大小,包括\\0; 02Sizeof与strlen的区别 数组法和指针法操作字符串 03 字符串操作 数组法,下标法 字符数组名,是个指针,是个常量指针; 字符数组名,代表字符数组首元素的地址,不代表整个数组的。 如果代表这个数组,那需要数组数据类型的知识! 下期分解 //字符串操作方法 数组下标法 指针法 int main13() { int i = 0; char buf5[100] = \ char *p = NULL; //下标法 for (i=0; i<100; i++) { printf(\ } printf(\ //指针法1 for (i=0; i<100; i++) { printf(\ } //buf5是个指针,是个常量指针 //指针法2 printf(\ p = buf5; 欢迎阅读

欢迎阅读 for (i=0; i<100; i++) { printf(\ } //buf5是个指针,是个常量指针 } 推演过程为:i变0+I, 去[]号加*号 //其实本质:指针*p间接寻址,操作内存; //[] 编译器为我们做了*p操作而已 3.2字符串做函数参数 深入理解指针。。。。。。。。。。。的关键是什么? 注意 指针和数组的巨大区别 char *p = “abcdefg”; Char *buf = “abcdefg”; 一维字符串内存模型:两种 void copy_str01(char *from, char *to) { for (; *from!='\\0'; from++, to++) { *to = *from; } *to = '\\0'; } void copy_str02(char *from, char *to) { while(*from!='\\0') { *to++ = *from++; } *to = '\\0'; } void copy_str03(char *from, char *to) { while( (*to=*from) !='\\0') { to++; from++; } } void copy_str04(char *from, char *to) { 欢迎阅读