《C专家编程》

const int * limitp = &limit;

这段代码表示limitp是一个指向常量整型的指针。这个指针不能用于修改这个整型数。

int array[] = {23, 34, 12, 17, 204, 99, 16};
#define TOTAL_ELEMENTS (sizeof(array)/sizeof(array[0]))

int main()
{
    int d = -1, x;
    /*...*/

    if(d <= TOTAL_ELEMENTS - 2)
        X = array[d+1];
    /*....*/
}

TOTAL_ELEMENTS所定义的值是unsigned int 类型(因为sizeof()的返回类型是无符号数)。if语句在signed int 和unsigned int 之间测试相等性,所以d被升级为unsigned int 类型,-1 转换成unsigned int 的结果将是一个非常巨大的正整数,致使表达式的值为假。启示:尽量不要使用无符号类型。

写成:
#define TOTAL_ELEMENTS (sizeof(array)/sizeof(array[0]))
而不是
#define TOTAL_ELEMENTS (sizeof(array)/sizeof(int))

因为前者可以在不修改#define 语句的情况下改变数组的基本类型。

malloc(strlen(str));——————————————错误的
malloc(strlen(str)+1);————————————正确的

因为用于容纳字符串结尾都有‘\0’字符。

NUL 用于结束一个ASCII字符串
NULL 用于表示什么也不指向(空指针)
network code()
{
    switch(line){
        case THING1:
        doit1();
    break;
        case THING2:
            if(x == STUFF){
                do_first_stuff();
                if(y == OTHER_STUFF)
                    break;
                do_later_stuff();
            }/*代码意图是跳到这里......*/
            initialize_modes_pointer();
            break;
        default:
            processing();
    }/*.....但是事实上跳到了这里*/
    use_modes_pointer();/*致使modes_pointer未初始化*/
}
i = 1, 2;         i最终结果是 1
i = (1, 2);       i最终结果是????
char * localized_time(char * filename)
{
    char buffer[120];
    /*......*/

    return buffer;
}

buffer是一个自动分配内存的数组,是该函数的局部变量。当控制流离开声明自动变量的范围时,自动变量便自动失效。这就意味着即使返回一个指向局部变量的指针,当函数结束时,由于该变量已被销毁,谁也不知道这个指针所指向的局部变量的内容是什么。解决办法:

  1. 使用全局声明数组
  2. 使用静态数组
  3. 显式分配内存 char * buffer = malloc(120);但是程序员承担内存管理的责任。它适用于多线程的代码。
  4. 要求调用者分配内存来保存函数的返回值。

第三章

union bits32_tag{
    int whole;                           /*一个32位的值*/
    struct {char c0, c1, c2, c3;} byte;  /*4个8位的值 */
}

这个联合体允许程序员提取整个32位值,也可以提取单独的字节字段如:value.byte.c0 。

char * const *(*next)();
  1. 首先看变量名,先把括号作为一个整体,得出“next 是一个指向…的指针”。
  2. 再考虑括号外面的东西,优先级规则告诉我们右边的括号优先级高,所以得出“next 是一个函数指针,指向一个返回的函数”。
  3. 处理前缀“*”,得出指针所指的内容。
  4. 最后,把“char * const”解释为指向字符的常量指针。
  5. 则这个声明表示“next是一个指针,它指向一个函数,该函数返回另一个指针,该指针指向一个类型为char的常量指针”。
typedef int x[10]和 #define x int[10]的区别?

 1. #define peach int
    unsigned peach i; // 没有问题
    typedef int banana;
    unsigned banana i; // 错误 非法的

 2. #define int_ptr int *
    int_ptr chalk,cheese;
    真正含义是int * chalk, cheese; 而cheese 是一个inttypedef char * char_ptr;
    char_ptr Bentley,Rolls_Royce;
    它们的类型相同,都是指向char的指针。
typedef struct my_tag {int i;} my_type;

使用:
struct my_tag variable_1;
my_type variable_2;

常用英语翻译

cast  强制类型转换
actual parameter, argument 实际参数
alignment   对齐
array initialization 数组初始化
automatic  自动的
availability 可用的
call-by-value  传值调用
consttant   常量
constraint  限制
curses library  函数库
declaration   声明
definition     定义
exceptions  异常
file descriptor  文件描述符
file pointer   文件指针
formal parameter 形式参数
heap   堆
kernel   内核
latency  等待时间
leak   泄露
linked list  链表
locality of reference  局部引用
method  方法
memory management  内存管理
pointer of function  函数指针
pointers-to-string 指向字符串的指针
polling   轮询
private part 私有部分
prototype   原型
pure code   纯代码
read-only  只读
returning an array from a function   从函数返回一个值
segmentation fault   段错误
segments    分段
sending a message  发送信息
signal handling  信号处理
stack   堆栈
stack frame  堆栈结构
stack segment  堆栈段
stack size 堆栈长度
storage-class   存储类型
storage-class specifier   存储类型说明符
swap 交换
tag   标签
template   模板
terminal 终端 
threads   线程
type-qualifier   类型限定符
type-specifier   类型说明符
undefined     未定义的
unspecified   未说明的
unsigned preserving   无符号保留
value preserving  值保留
variable  argument   变量参数
virtual     虚拟
white space  空格
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值