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是一个自动分配内存的数组,是该函数的局部变量。当控制流离开声明自动变量的范围时,自动变量便自动失效。这就意味着即使返回一个指向局部变量的指针,当函数结束时,由于该变量已被销毁,谁也不知道这个指针所指向的局部变量的内容是什么。解决办法:
- 使用全局声明数组
- 使用静态数组
- 显式分配内存 char * buffer = malloc(120);但是程序员承担内存管理的责任。它适用于多线程的代码。
- 要求调用者分配内存来保存函数的返回值。
第三章
union bits32_tag{
int whole; /*一个32位的值*/
struct {char c0, c1, c2, c3;} byte; /*4个8位的值 */
}
这个联合体允许程序员提取整个32位值,也可以提取单独的字节字段如:value.byte.c0 。
char * const *(*next)();
- 首先看变量名,先把括号作为一个整体,得出“next 是一个指向…的指针”。
- 再考虑括号外面的东西,优先级规则告诉我们右边的括号优先级高,所以得出“next 是一个函数指针,指向一个返回的函数”。
- 处理前缀“*”,得出指针所指的内容。
- 最后,把“char * const”解释为指向字符的常量指针。
- 则这个声明表示“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 是一个int。
typedef 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 空格