1.运算符优先级,这个我是肯定记不住,每次遇到的时候都纠结下,然后去查下,或者直接括号,但是括号太多,你懂得,要用notepad才能理清各种层次。这里啦个下来,留着参考。
另外小测试下++p++,这个为什么错误???(参考左值),这些*p++就没什么好说的了,你猜是取*p还是*(p++),这个按优先级肯定是后面的,那么为什么我要问*p,自己写个小测试玩玩就好了。尼玛的,vs被卸载,devcpp本来想找来装的,找了半天没找到,开虚拟机,上linux
#include<stdlib.h> #include<stdio.h> void main() { printf("into main\n"); char *p = NULL; char a[5] = "1234"; p = a; printf("p %s\n", p); printf("a %s\n", a); printf("p %p\n", p); printf("a addr %p\n", &a); printf("p %c\n",*p++); }
[lc_posp@localhost bin]$ ./ctest
into main
p 1234
a 1234
p 0xbfe32dc7
a addr 0xbfe32dc7
p 1
2.函数调用部分。
相信这个f();大家都知道,那么这个f;呢,反正我以前是不知道。f表示函数的地址。
3.数组与指针部分。
int *p; int a[3] = {1, 2, 3};
p = &a;//这语句为什么错误?反正我以前是没有考虑过,p是一个指向int的指针,而&a是一个地址,某种意义上来说可以看作一个指针,他的类型是指向一个int型数组的指针,这样赋值,类型肯定不匹配。。。
二维数组与指针数组,数组指针,及其混用,这些好像不易混淆,没甚好讲的。指针数组就是一个数组,数据元素都是地址,数组指针,是一个指针,指向一个数组,类型看定义吧。强调下二维数组及其混用吧。
int a[3][4];
int *aa[4];
我的理解比较笨,就是脑袋想了下3*4的矩阵,第一个就解决了。
第二个一个指针,指向含有4个元素的数据的数组。
不好画图,画图或者想一下基本下次就不会错了。
4.关于内存申请与释放,malloc与free,这个没什么好说的,但是提示一点malloc的时候,如果精确长度时,要注意多加一,用来存放\0.
5.指针的复制q = p,这个也没什么好说的,就是copy下变量的内容,但是存变量的地址肯定不一样的&q != &p。说的都是废话。。。
6.申明与定义。
这个static,此文件内作用。我忘记了,好2222222222222.。。。。。。。。。
遇到的问题基本都是全局变量,加extren的那种.
7.关于除法与位移
除法的效率很低,是2的倍数尽量用>> 和 <<
int t = 4;
int div2 = 4>>1; //2
int chen2 = 4<<2;//8
8.不定参数问题,这个我有点不想讲,不是太简单,是我看过了,记不住。2货。
用途我就看到在打印日志里遇到过,其他好像没什么地方.
void va_start(va_list ap, last);
type va_arg(va_list ap, type);
void va_end(va_list ap);
假设lastarg是func的最后一个具名参数,即在func函数定义中...之前的那个参数(在printf中lastarg是format),在func中首先定义一个变量:
va_list ap
这个变量以后会依次指向各个可变参数。ap在使用之前必须用宏va_start初始化一次,如下所示:
va_start(ap, lastarg);
其中lastarg是func中的最后一个具名参数。然后就可以用va_arg来获得下一个不定参数(前提是知道这个不定参数的类型type):
type next = va_arg(ap, type)
最后就是用宏va_end来清理现场。