1 在 C 语言中实现抽象数据类型什么方法最好?
让客户使用指向没有公开定义 (也许还隐藏在类型定义后边) 的结构类型的指针是一个好办法。只要不访问结构成员, 声明和使用 ``匿名'' 结构指针 (不完全结构类型指针)是合法的。这也是使用抽象数据类型的原因。
2 在 C 中是否有模拟继承等面向对象程序设计特性的好方法?
把函数指针直接加入到结构中就可以实现简单的 ``方法''。你可以使用各种不雅而暴力的方法来实现继承, 例如通过预处理器或含有 ``基类'' 的结构作为开始的子集, 但这些方法都不完美。 很明显, 也没有运算符的重载和覆盖 (例如, ``导出类'' 中的 ``方法''), 那些必须人工去做。
显然的, 如果你需要 ``真'' 的面向对象的程序设计, 你需要使用一个支持这些特性的语言, 例如 C++。
3 为什么 sizeof 返回的值大于结构的期望值, 是不是尾部有填充?
为了确保分配连续的结构数组时正确对齐, 结构可能有这种尾部填充。即使结构不是数组的成员, 填充也会保持, 以便 sizeof 能够总是返回一致的大小。
4 如何确定域在结构中的字节偏移?
ANSI C 在 中定义了 offsetof() 宏, 用 offsetof(struct s, f) 可以计算出域 f 在结构 s 中的偏移量。 如果出于某种原因, 你需要自己实现这个功能, 可以使用下边这样的代码:
#define offsetof(type, f) ((size_t) \
((char *)&((type *)0)->f - (char *)(type *)0))
这种实现不是 100% 的可移植; 某些编译器可能会合法地拒绝接受。
5 这是个巧妙的表达式: a ^= b ^= a ^= b 它不需要临时变量就可以交换 a 和 b 的值。
这不具有可移植性。它试图在序列点之间两次修改变量 a, 而这是无定义的。
例如,有人报告如下代码:
int a = 123, b = 7654;
a ^= b ^= a ^= b;
在 SCO 优化 C 编译器 (icc) 下会把 b 置为 123, 把 a 置为 0。
6 一个指针变量分配多少内存?
这是个挺有误导性的问题。当你象这样声明一个指针变量的时候,
char *p;
你 (或者, 更准确地讲, 编译器) 只分配了足够容纳指针本身的内存; 也就是说, 这种情况下, 你分配了 sizeof(char*) 个字节的内存。但你还没有分配任何让指针指向的内存。
7 我认为我的编译器有问题: 我注意到 sizeof('a') 是 2 而不是 1 (即, 不是 sizeof(char))。
可能有些令人吃惊, C 语言中的字符常数是 int 型, 因此 sizeof('a') 是 sizeof(int), 这是另一个与 C++ 不同的地方。
8 为什么这些代码 while(!feof(infp)) { fgets(buf, MAXLINE, infp); fputs(buf, outfp); } 把最后一行复制了两遍?
在 C 语言中, 只有输入例程试图读并失败以后才能得到文件结束符。换言之, C 的 I/O 和 Pascal 的不一样。通常你只需要检查输入例程的返回值, 例如, fgets() 在遇到文件结束符的时候返回 NULL。实际上, 在任何情况下, 都完全没有必要使用 feof()。
9 我第一次把一个程序分成多个源文件, 我不知道该把什么放到 .c 文件, 把什么放到 .h 文件。(``.h" 到底是什么意思?)
作为一般规则, 你应该把这些东西放入头 (.h) 文件中:
* 宏定义 (预处理 #defines)
* 结构、联合和枚举声明
* typedef 声明
* 外部函数声明(参见问题 1.4)
* 全局变量声明
当声明或定义需要在多个文件中共享时, 尤其需要把它们放入头文件中。特别是, 永远不要把外部函数原型放到 .c 文件中。 参见问题 1.3。
另一方面, 如果定义或声明为一个 .c 文件私有, 则最好留在 .c 文件中。
10 联合既可以出现在结构内, 它的成员也可以是结构。
例如:
struct{
int age;
char *addr;
union{
int i;
char *ch;
}x;
}y[10];
若要访问结构变量y[1]中联合x的成员i, 可以写成:
y[1].x.i;
11 枚举类型变量的赋值和使用
main(){
enum weekday
{
sun,mon,tue,wed,thu,fri,sat
} a,b,c;
a=sun;
b=mon;
c=tue;
printf("%d,%d,%d",a,b,c);
}
12 位域
struct bs
{
unsigned a:4
unsigned :0 /*空域*/
unsigned b:4 /*从下一单元开始存放*/
unsigned c:4
}
struct k
{
int a:1
int :2 /*该2位不能使用*/
int b:3
int c:2
};
部分来源于:
阅读(1633) | 评论(0) | 转发(0) |