char a[] = "string literal"; char *p = "string literal"; 当

字符串常量有两种稍有区别的用法。用作数组初始值(如同在char a[] 的声明中), 它指明该数组中字符的初始值。其它情况下, 它会转化为一个无名的静态字符数组, 可能会存储在只读内存中, 这就是造成它不一定能被修改。在表达式环境中, 数组通常被立即转化为一个指针(参见第6 章), 因此第二个声明把p 初始化成指向无名数组的第一个元素。为了编译旧代码, 有的编译器有一个控制字符串是否可写的开关。
C学习笔记 | 2011-01-22 12:53 | 阅读 903 次 | 评论 0 条

这样的初始化有什么问题?char *p = malloc(10); 编译器提示 “非法初始式” 云云。

这个声明是静态或非局部变量吗?函数调用只能出现在自动变量(即局部非静态变量) 的初始式中。
C学习笔记 | 2011-01-22 12:42 | 阅读 971 次 | 评论 0 条

代码int f() { char a[] = "Hello, world!";} 不能编译。

可能你使用的是ANSI 之前的编译器, 还不支持“自动聚集”(automatic aggregates,即非静态局部数组、结构和联合) 的初始化。
C学习笔记 | 2011-01-22 12:42 | 阅读 834 次 | 评论 0 条

对于没有初始化的变量的初始值可以作怎样的假定?如果一个全局 变量初始值为“零”,

具有“静态” 生存期的未初始化变量(即, 在函数外声明的变量和有静态存储类型的变量) 可以确保初始值为零, 就像程序员键入了“=0” 一样。因此, 这些变量如果是指针会被初始化为正确的空指针, 如果是浮点数会被初始化为0.0 (或正确的类型, 参见第5 章)。具有“自动” 生存期的变量(即, 没有静态存储类型的局部变量) 如果没有显示地初始化, 则包含的是垃圾内容。对垃圾内容不能作任何有用的假设。这些规则也适用于数组和结构(称为“聚合体” ); 对于初始化来说, 数组和结构都被认为是“变量”。用malloc() 和realloc() 动态分配的内存也可能包含垃圾数据, 因此必须由调用者正...
C学习笔记 | 2011-01-22 12:38 | 阅读 901 次 | 评论 0 条

main() 的正确定义是什么? void main() 正确吗?

这样的定义不正确1、无参函数的定义形式  类型标示符 函数名()  {声明部分  语句  }  2、有参函数定义的一般形式  类型标示符 函数名 (形式参数列表)  {声明部分  语句  }  3、可以有“空函数”  它的形式为  类型说明符 函数名()  { }  例如:  dummy(){}  4、对形参的声明的传统方式  在老版本c语言中,对形参类型的声明是放在函数定义的第二行,也就是不再第一行的括号内指定形参的类型,而在括号外单独指定,例如上面定义的max函数可以写成一下形式:  int max (x,y)/*指定形参x,y*/  int x,y;/*对形参指定类型*/  {in...
C学习笔记 | 2011-01-22 12:37 | 阅读 1364 次 | 评论 0 条

函数只定义了一次, 调用了一次, 但编译器提示非法重定义了。

在范围内没有声明就调用(可能是第一次调用在函数的定义之前) 的函数被认为返回整型(int) (且没有任何参数类型信息), 如果函数在后边声明或定义成其它类型就会导致矛盾。所有函数(非整型函数一定要) 必须在调用之前声明。另一个可能的原因是该函数与某个头文件中声明的另一个函数同名。
C学习笔记 | 2011-01-22 12:30 | 阅读 824 次 | 评论 0 条

怎样建立和理解非常复杂的声明?例如定义一个包含N 个指向返回 指向字符的指针的函数

这个问题至少有以下3 种答案:1. char *(*(*a[N])())();2. 用typedef 逐步完成声明:typedef char *pc; /* 字符指针*/typedef pc fpc(); /* 返回字符指针的函数*/typedef fpc *pfpc; /* 上面函数的指针*/typedef pfpc fpfpc(); /* 返回函数指针的函数*/typedef fpfpc *pfpfpc; /* 上面函数的指针*/pfpfpc a[N]; /* 上面指针的数组*/3. 使用cdecl 程序, 它可以把英文翻译成C 或者把C 翻译成英文:cdecl> declare a...
C学习笔记 | 2011-01-22 12:27 | 阅读 997 次 | 评论 0 条

难道在C语言中一个结构不能包含指向自己的指针吗?

C 语言中的结构当然可以包含指向自己的指针; [K&R2, 第6.5 节] 的讨论和例子表明了这点。NODEPTR 例子的问题是在声明next 域的时候typedef 还没有定义。为了解决这个问题, 首先赋予这个结构一个标签(“struct node”)。然后,声明“next” 域为“struct node *”, 或者分开typedef 定义和结构定义, 或者两者都采纳。以下是一个修改后的版本:struct node {char *item;struct node *next;};typedef struct node *NODEPTR;至少还有三种同样正确的方法解决这个问题。...
C学习笔记 | 2011-01-22 12:25 | 阅读 913 次 | 评论 0 条

关键字auto 到底有什么用途?

毫无用途;它已经过时。C语言C语言中提供了存储说明符auto,register,extern,static说明的四种存储类别。四种存储类别说明符有两种存 储期:自动存储期和静态存储期。其中auto和register对应自动存储期。具有自动存储期的变量在进入声明该变量的程序块是被建立,它在该程序块活 动时存在,退出该程序块时撤销。在函数内部定义的变量成为局部变量。在某些C语言教材中,局部变量称为自动变量,这就与使用可选关键字a u t o定义局部变量这一作法保持一致。局部变量仅由其被定义的模块内部的语句所访问。换言之,局部变量在自己的代码模块之外是不可知的。切记:模块以左花括号...
C学习笔记 | 2011-01-22 12:22 | 阅读 1122 次 | 评论 0 条

extern 在函数声明中是什么意思?

它可以用作一种格式上的提示表明函数的定义可能在另一个源文件中, 但在extern int f();和int f();之间并没有实质的区别。
C学习笔记 | 2011-01-22 12:12 | 阅读 917 次 | 评论 0 条

怎样定义和声明全局变量和函数最好?

首先, 尽管一个全局变量或函数可以(在多个编译单元中) 有多处“声明”, 但是“定义” 却只能允许出现一次。定义是分配空间并赋初值(如果有) 的声明。最好的安排是在某个相关的.c 文件中定义, 然后在头文件(.h) 中进行外部声明, 在需要使用的时候, 只要包含对应的头文件即可。定义变量的.c 文件也应该包含该头文件, 以便编译器检查定义和声明的一致性。这条规则提供了高度的可移植性: 它和ANSI C 标准一致, 同时也兼容大多数ANSI 前的编译器和连接器。Unix 编译器和连接器通常使用“通用模式” 允许多重定义, 只要保证最多对一处进行初始化就可以了; ANSI C 标准称这种行为...
C学习笔记 | 2011-01-22 12:11 | 阅读 898 次 | 评论 0 条

64 位机上的64 位类型是什么样的?

C99 标准定义了long long 类型, 其长度可以保证至少64 位, 这种类型在某些编译器上实现已经颇有时日了。其它的编译器则实现了类似longlong 的扩展。另一方面, 也可以实现16 位的短整型、32 位的整型和64 位的长整型, 有些编译器正是这样做的。
C学习笔记 | 2011-01-22 12:10 | 阅读 774 次 | 评论 0 条

我如何决定使用那种整数类型?

如果需要大数值(大于32, 767 或小于¡32, 767), 使用long 型。否则, 如果空间很重要(如有大数组或很多结构), 使用short 型。除此之外, 就使用int 型。如果严格定义的溢出特征很重要而负值无关紧要, 或者你希望在操作二进制位和字节时避免符号扩展的问题, 请使用对应的无符号类型。但是, 要注意在表达式中混用有符号和无符号值的情况。尽管字符类型(尤其是无符号字符型) 可以当成“小” 整型使用, 但由于不可预知的符号扩展和代码增大有时这样做可能得不偿失。使用无符号字符型有所帮助;类似的问题参见问题。在选择浮点型和双精度浮点型时也有类似的权衡。但如果一个变量...
C学习笔记 | 2011-01-22 12:09 | 阅读 799 次 | 评论 0 条
文章归档
最新评论