轻松入门 实战应用 技术交流群387220290
主调函数还是被调用函数分配内存 被调用函数是在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)应用指针必须和函数调用相结合(指针做函数参数)
指针是子弹,函数是枪管;子弹只有沿着枪管发射才能显示它的威力;指针的学习重点不言而喻了吧。接口的封装和设计、模块的划分、解决实际应用问题;它是你的工具。
轻松入门 实战应用 技术交流群387220290
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语言中的字符串可以分配于栈空间,堆空间或者只读存储区 轻松入门 实战应用 技术交流群387220290
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++) { 轻松入门 实战应用 技术交流群387220290
} 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++; } 轻松入门 实战应用 技术交流群387220290
*to = '\\0'; } void copy_str03(char *from, char *to) { while( (*to=*from) !='\\0') { to++; from++; } } void copy_str04(char *from, char *to) { while( (*to++=*from++) !='\\0') { ; } } int copy_str05_good(const char *from, char *to) { if (from==NULL || to==NULL) { printf(\ return -1; } while( (*to++=*from++) !='\\0') { ; } return 0; } 典型错误知多少 char *str_cnct(char *x, char* y) /*简化算法*/ { char str3[80]; char *z=str3; /*指针z指向数组str3*/ while(*z++=*x++); z--; /*去掉串尾结束标志*/ while(*z++=*y++); z=str3; /*将str3地址赋给指针变量z*/ return(z);