C 程序员传统上喜欢知道很多(可能比他们需要知道的还要多) 关于机器实现的细节。
空指针在源码和大多数机器实现中都用零来表示的事实导致了很多无根据的猜测。
真有机器用非零空指针?或者不同类型用不同的表达?
至少PL/I, Prime 50 系列用段07777, 偏移0 作为空指针。
后来的型号使用段0, 偏移0 作为C 的空指针,...
这是一种便利。
由于数组会马上蜕变为指针, 数组事实上从来没有传入过函数。
允许指针参数声明为数组只不过是为让它看起来好像传入了数组, 因为该参数可能在函数内当作数组使用。
...
传统的解决方案是分配一个指针数组,
然后把每个指针初始化为动态分配的“列”。
以下为一个二维的例子:
#include <stdlib.h>...
现象:当我向一个接受指针的指针的函数传入二维数组的时候, 编译器报错了。
数组蜕化为指针的规则(参见问题6.3) 不能递归应用。
数组的数组(即C 语言中的二维数组) 蜕化为数...
这并非易事。
一种办法是传入指向[0][0] 成员的的指针和两个维数, 然后“手 工” 模拟数组下标。
void f2(int *ARyp, int n...
没有完美的方法。
假设有如下声明
int ARray[NROWS][NCOLUMNS];
int **ARray1; /* 不齐的*/
int **ARray2; /* 连...
问题:为什么这段代码不行?
chAR *answer;
printf("Type something:\n");
gets(answer);
printf("You typ...
我的strcat() 不行.
我试了chAR *s1 = "Hello, "; chAR *s2 ="world!"; chAR *s3 = strcat(s1, s2);
但...
我有个函数, 本该返回一个字符串, 但当它返回调用者的时候, 返回串却是垃圾信息。
确保指向的内存已经正确分配了。
例如, 确保你没有做下面这样的事情:
chAR *itoa...
字符和字符串的区别显而易见, 而strcat() 用于连接字符串。
C 中的字符用它们的字符集值对应的小整数表示, 参见下边的问题8.4。
字符串用...
我在检查一个字符串是否跟某个值匹配。
为什么这样不行?
chAR *string;
. . .
if(s...
在C语言中字符用它们的字符集值对应的小整数表示。
因此, 你不需要任何转换函数:
如果你有字符, 你就有它的值。
数字字符和它们对...
对于这个问题没有什么好的答案。
如果这两个值是整数, 可以使用异或的技术, 但是这对浮点值或指针却不行, 对同一个值也无能为力。
(参见问题3.4和...
通常的目标是书写一个象包含一个单独的函数调用语句的宏。
这意味着“调用者”需要提供最终的分号, 而宏体则不需要。
因此宏体不能为简单的括弧包围的复合语句...
一种流行的技巧是用一个单独的用括弧括起来的的“参数” 定义和调用宏,
参数在宏扩展的时候成为类似printf() 那样的函数的...
问题:
很多ANSI 编译器在遇到以下代码时都会警告类型不匹配。
extern int func(float); int func(x) float x; { . . .
你...
你可以向接受const-T 的指针的地方传入T 的指针(任何类型T都适用)。
但是,
这个允许在带修饰的指针类型上轻微不匹配的规则(明显的例外)却...