首先,将我首要了解C的语言的魅力的原理和数据产生数据也到底如何形成,以及将类型进行调动起来将类型进行一步一步缓存曾数据进行输出类型点了。现在就行更好逻辑理解。
声明和初始化
- 我如何决定使用那种整数类型?
如果需要大数值 (大于 32, 767 或小于 −32, 767), 使用 long 型。否则, 如果空 间很重要 (如有大数组或很多结构), 使用 short 型。除此之外, 就使用 int 型。如 果严格定义的溢出特征很重要而负值无关紧要, 或者你希望在操作二进制位和字 节时避免符号扩展的问题, 请使用对应的无符号类型。但是, 要注意在表达式中混 用有符号和无符号值的情况。 尽管字符类型 (尤其是无符号字符型) 可以当成 “小” 整型使用, 但由于不可预 知的符号扩展和代码增大有时这样做可能得不偿失。使用无符号字符型有所帮助; 类似的问题参见问题 12.1。 在选择浮点型和双精度浮点型时也有类似的权衡。但如果一个变量的指针必 须为特定的类型时, 以上规则不再适用。 如果因为某种原因你需要声明一个有严格大小的变量, 确保象 C99 的 <int- types.h> 那样用某种适当的 typedef 封装这种选择。 |
- 64 位机上的 64 位类型是什么样的?
C99 标准定义了 long long 类型, 其长度可以保证至少 64 位, 这种类型在某些 编译器上实现已经颇有时日了。其它的编译器则实现了类似longlong 的扩展。 另一方面, 也可以实现 16 位的短整型、32 位的整型和 64 位的长整型, 有些编译器 正是这样做的。 |
- 我似乎不能成功定义一个链表。我试过 typedef struct { char*item; NODEPTR next; } *NODEPTR; 但是编译器报了错误信息。难道在C语言中一个结构不能包含指向自己的指针吗?
C 语言中的结构当然可以包含指向自己的指针; [K&R2, 第 6.5 节] 的讨论和 例子表明了这点。 NODEPTR 例子的问题是在声明 next 域的时候 typedef 还没 有定义。为了解决这个问题, 首先赋予这个结构一个标签 (“struct node”)。然后, 声明 “next” 域为 “struct node *”, 或者分开 typedef 定义和结构定义, 或者两者都 采纳。以下是一个修改后的版本:
至少还有三种同样正确的方法解决这个问题。 在用 typedef 定义互相引用的两个结构时也会产生类似的问题, 可以用同样的 方法解决。 |
- 怎样建立和理解非常复杂的声明?例如定义一个包含 N 个指向返回指向字符的指针的函数的指针的数组?
这个问题至少有以下 3 种答案:
|
- 对于没有初始化的变量的初始值可以作怎样的假定?如果一个全局变量初始值为 “零”, 它可否作为空指针或浮点零?
具有 “静态” 生存期的未初始化变量 (即, 在函数外声明的变量和有静态存储 类型的变量) 可以确保初始值为零, 就像程序员键入了 “=0” 一样。因此, 这些变 量如果是指针会被初始化为正确的空指针, 如果是浮点数会被初始化为 0.0 (或正 确的类型, 参见第 5 章)。 具有 “自动” 生存期的变量 (即, 没有静态存储类型的局部变量) 如果没有显示 地初始化, 则包含的是垃圾内容。对垃圾内容不能作任何有用的假设。 这些规则也适用于数组和结构 (称为 “聚合体” ); 对于初始化来说, 数组和结 构都被认为是 “变量”。 用 malloc() 和 realloc() 动态分配的内存也可能包含垃圾数据, 因此必须由调 用者正确地初始化。用 calloc() 获得的内存为全零, 但这对指针和浮点值不一定有 用。 |
- 代码 int f() { char a[] = "Hello, world!";} 不能编译。
可能你使用的是 ANSI 之前的编译器, 还不支持 “自动聚集”(automatic aggre- gates, 即非静态局部数组、结构和联合) 的初始化 |
- 这样的初始化有什么问题?char *p = malloc(10); 编译器提示
“非法初始式” 云云
这个声明是静态或非局部变量吗?函数调用只能出现在自动变量 (即局部非 静态变量) 的初始式中 |