#1 关于指针
int *ptr; //指向int类型变量的指针
char *ptr; //指向char类型变量的指针
int **ptr; //指向指向int类型变量的指针变量的指针
int *ptr[3]; //有三个指向int类型变量的指针的数组
int (*ptr)[3]; //指向含有三个int类型元素的数组的指针
int (*pfun)(int ,int); //指向返回值为int类型,参数有两个,都是int类型的函数的指针
int* ptr[3][4]; //二维指针数组
int*(*ptr)[4]; //指向整个一维指针数组的指针
void* (*ptr)(void*); //指向函数的指针
int* pMove(); //返回指针的函数
int (*p[3])(int); //函数指针数组
int (*p)[3][4]; //指向整个二维数组的指针
int (*p[3])[4]; //指向一维数组的指针的数组
几个繁杂的指针的图解方式
int (*p[3])(int);
int*(*ptr)[4];
int (*p[3])[4]
char(*(* (*q)() ) [5])()
关于栈与堆的问题小总结
# 栈内存地址由高往低开辟,变量内部反之;堆内存由低往高开辟,前者时内存中连续空间,后者时非连续的
例如 int a; 0x0012ff7c
int b; 0x0012ff78
int c[2]; 0x0012ff6c // c[0] 0x0012ff6c c[1] 0x0012ff70 c[2] 0x0012ff74
堆内存增长方式得到正确验证
pA p = (pA)malloc(sizeof(A)); p 0x00540060
pA q = (pA)malloc(sizeof(A)); q 0x00541da0 //依次开辟,但是非连续 由于系统是用链表来存储的空闲内存地址的
关于自己代码风格需要注意的
#1 注释太少
#2 运算符优先级记不清楚时使用括号(多个且或操作时)
#3 数据与函数分离,少使用全局变量
#4 条件或者循环中,哪怕一行也要加大括号,防止以后增加代码时忘记写大括号
#5 条件语句,如果没有else选项,也要写上esle{;} 以方便代码扩充和思路明确
#6 函数内satatic变量的意义----不在栈内存,整个程序生命周期只初始化一次,每一次调用该函数,继续从上次结果开始执行
#7if或者while语句中 非零为真 只有0为假 坑爹的-1啊!
#8在函数内释放指针指向的的堆内存的时候,只需要传递指针副本即可,如果要同时赋值为NULL,则要用指向指针的指针做形参