我的读书笔记《C和指针》

2013.03.12
1.注释代码
  #if 0
      statements
  #endif
  注释效果要比要好
2.stdio.h头文件可以访问标准I/O库(Standard I/O Library),并且定义了EXIT_SUCCESS和EXIT_FAILURE符     号。
3.二维数组 a[3][4], a+1并不表示元素a01的地址,而是数组第二行的首地址,因为二维数组名是指向行的,而   非指向某个元素。
4.C++中,++运算和*运算具有相同的优先级,且方向是从右至左,所以*P++和 *(p++)作用是完全相同的。
5.typedef 允许为各种数据类型定义新名字。
  e.g. typedef char *Ptr_to_char;
        Ptr_to_char a; //声明a是指向字符的指针
6.const在指针中的应用
  e.g. int const *pi       //一个指向整型常量的指针,地址可以改,内容不可以改。
        int *const pi       //一个指向整型的常量指针,内容可以改,地址不可以改。
        int const *const pi //一个指向整型常量的常量指针,两者都不能改。
7.判断表达式的长度并不需要对表达式进行求值
  e.g.sizeof(a=b+1),此时并没有对a赋值
8.强制类型转换具有很高的优先级,把强制类型转换放在一个表达式中,只会改变第一个项目的类型,如果对
  整 个表达式的结果进行强制类型转换,必须将表达式用括号括起来。
9."短路求值"---short-circuited evaluation 
  e.g. (1)(a>5)&&(a<10) 如果(a>5)为假,则不用判断后者
        (2)条件操作符 express1?expression2:expression3 如果expression1 为真,取表达式2,而不用计算3
10.条件操作符:
    e.g. b=a>5?3:20-->if(a>5) b=3; else b=20;
11.逗号操作符:整个逗号表达式的值是最后那个表达式的值。表达式①,②,③,④的值为④的值。
12.array[下标]=*(array+下标)
    除了优先级以外,下标引用和间接访问完全相同。

13.布尔值:C并不具备显式的布尔类型,所以可以用整数来代替,规则是:零是假,任何非零值都是真。

          如果一个变量用于表示布尔值,应该始终把它设置为0或1.

14.左值和右值:左值标识了一个可以存储结果值的地点,而右值指定了一个值。e.g.a=b+5正确,b+5=a错误。

   变量可以作为左值,表达式也可以。

   e.g.*pi可以当做左值和右值,此时左值指定需要进行修改的位置,右值提取当前存储于这个位置的值。

   e.g.int a[30];

       .....

       a[b+10]=0; //表达式的左边是个表达式,但它是一个合法的左值,因为它标识了一个特定的位置。

15.int array[10];

   表达式 2[array] 是合法的,=*(array+2)

16.数组参数的值是一个指针,下标引用实际上是对指针执行间接访问操作,在声明数组参数时不指定它的长度    是合法的,因为函数并不为数组元素分配内存。

17.数组名不用指针常量来表示的两种情况(自己也不是很明白,先放着吧,呵呵)

   ① 数组名作为sizeof的操作符       sizeof返回整个数组的长度,而不是指向数组的指针

   ② 数组名作为单目操作符&的操作数  此时产生的是一个指向数组的指针,而不是指向某个指针常量的指针

18.可变参数列表 通过stdarg宏来实现,该宏定义于stdarg.h头文件,声明了一个类型va_list 和三个宏          va_begin、va_arg、va_end。

19.指定位置设置为1   value=value | 1<<bit_number

   指定位置清0       value=value & ~1<<bit_number

20.函数指针最常用的两个用途:把函数指针作为参数传递给函数(回调函数)以及用于转换表

转换表:例子

double add(double,double);

double sub(double,double);

double mul(double,double);

double div(double,double);

double (* func[])(double,double)={add,sub,mul,div};

21.树的遍历:前序遍历,中序遍历,后序遍历,层次遍历

   其中前序遍历检查节点的值,然后递归的遍历左子树和右子树

       中序遍历首选遍历左子树,然后检查节点的值,最后遍历右子树

       后序遍历首先遍历左右子树,然后检查节点的值

       层次遍历逐层检查树的节点,首先处理根节点,接着是它的孩子,再接着是孙子,依次类推。

     根据访问结点操作发生位置命名:
  ① NLR:前序遍历(PreorderTraversal亦称(先序遍历))
         ——访问结点的操作发生在遍历其左右子树之前。
  ② LNR:中序遍历(InorderTraversal)
        ——访问结点的操作发生在遍历其左右子树之中(间)。
   ③ LRN:后序遍历(PostorderTraversal)
        ——访问结点的操作发生在遍历其左右子树之后。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值