1:未初始化和非法变量
在定义指针时一定要初始化,确保其指向一个合法的地址。或者利用malloc()分配地址空间。
2:在确认一个指针是否指向NULL时可以与0 比较, 这只是一个约定而已/
3:在对NULL指针进行间接访问时容易出错!
4: *(int*)100=25; *100=25; 两条语句的区别: 第一是非法。第二是吧25放到地址100处。
5:辅助函数:statice类型,也就是实现所谓“黑盒”:加上statice修饰符后其他源代码无法调用此函数,让程序更加独立。
6:尽量少使用递归,效率太低!
7:数组B[10]; B是一个指针常量。其有确定的指向和分配好的空间。当然常量不能修改,不能被赋值。
8:int * ap = arry[2]; ap[0] 与*ap表示的意义相同。ap[-1] ==arry[1]; 相当与*(ap-1)
9: 指针比下标更有效率。
10:char *arry="hello" char arry[]="hello" 前者才是真正的字符串。后者相当于一个字符数组。
11:strlen(arry)-strlen(x)>=0这个表达式永远成立, strlen计算出的为无符号整形,两个无 运算得无、
12: 高级字符串处理函数 strspn(char const *str char const *group) 在group中寻找 是str字符串
13:结构体的自引用
struct selp
{
int a;
struct selp-ref b;
int c;
}
这个是不合法的 selp 有自己的结构体,b也有自己的结构体............反复下去样子就像递归、长度无法预测、
struct selp
{
int a;
struct selp *b;
int c;
}
正确的! 因为编译器在 结构体之前就已经知道 指针的长度!
14: 分配内存的时候最好用 malloc((数量)*sizeof(类型名)这样分配 可移植性好!
15: assert 宏 assert(1 == 0); 打印出类似Assertion failed: 1 == 0, file d:\我的文档\visual studio projects\learning\assert\assert.cpp, line 9的信息/
16: int *f() int (*f) (); 前者是声明的返回值为 指向int型的指针。后者f是指向int型函数的指针。
17: int (*f[ ]) () 根据运算符优先级 可知 f是一个 元素为“指向 int类型函数的指针” 的数组 。函数指针数组
18:函数指针声明 int f(); int (*pf)()=&f;即可,其中&可选,以为程序调用函数会将函数名转化为函数指针,&只是显式的说明了编译器将隐式执行的任务。 int ans;ans = f(25);ans=*pf(25); ans = pf(25); 以上三条赋值语句效果是一样的、
19:字符串常量:
当一个字符床常量出现在表达式中的时候,他的值是一个指针常量。
“xyz”+1 的值就是’y‘,“xyz”[2] 的值就是z
应用: 打印星号...效率很高!
void mystery(int n)
{
n+=5;
n/=10;
printf("%s\n","*********"+10-n);
}
20: 注意预定义的换行时的反斜杠‘
21:perror(char const *ch)只要ch不是NULL就打印出CH的字符串
void exit(int status) 执行完这个函数之后程序结束/
22 : ms—dos下的文本流结束的标志是以一个回车或者换行符结尾,unxi下为一个换行符。
23:流通过fopen函数打开,fclose关闭。