c traps and pitfalls reading notes(2)

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来清理现场。

 



posted @ 2016-07-06 22:34  ashen~  阅读(166)  评论(0编辑  收藏  举报