必须弄懂的495个C语言问题.pdf )
### 必须弄懂的495个C语言问题 #### 1. 声明和初始化 **1.1 如何决定使用哪种整数类型?** 在C语言中选择整数类型时,应考虑所需的范围和存储空间。常见的整数类型包括`char`、`short`、`int`、`long`以及`long long`。`char`用于单字节(通常是8位),`short`通常为16位,`int`一般为32位,而`long`和`long long`则分别为32位和64位。具体的选择取决于程序的需求。例如,如果只需要表示较小的数字,可以选择`short`以节省内存。 **1.2 64位机上的64位类型是什么样的?** 在64位系统上,`long`类型通常被定义为64位,这意味着它可以存储更大范围的值。此外,C99标准引入了`int64_t`类型(通过`<stdint.h>`头文件)来确保在所有平台上都能获得64位整数类型。使用这些类型可以提高程序的可移植性。 **1.3 怎样定义和声明全局变量和函数最好?** 全局变量应该谨慎使用,因为它们可能会导致代码维护困难。如果确实需要使用全局变量,应该确保其命名具有描述性,并且在尽可能少的文件中声明。函数声明应该清晰地表明其输入输出和功能。使用`extern`关键字可以在不同源文件之间共享全局变量和函数声明。 **1.4 `extern`在函数声明中是什么意思?** `extern`关键字用于声明一个变量或函数的外部定义。当在一个源文件中声明了一个在另一个源文件中定义的变量或函数时,就会使用`extern`。这有助于链接时识别变量或函数的定义。 **1.5 关键字`auto`到底有什么用途?** `auto`关键字用于声明变量并指定它是自动存储持续期的,即在函数调用期间存在并在函数退出时销毁。自C99以来,`auto`通常用于变量声明中,以告诉编译器该变量将被自动分配存储空间。在现代C语言编程中,`auto`很少被明确使用,因为大多数变量都是自动类型的。 **1.6 如何定义包含指向自身结构的指针?** 定义包含指向自身结构的指针时,需要使用`typedef`和一个不完全类型声明。例如: ```c typedef struct Node { char *item; struct Node *next; } Node; ``` 这里,`struct Node *next;`引用了相同的结构类型。 **1.7 如何理解和构建非常复杂的声明?** 构建复杂的声明时,可以从内向外解析。例如,对于`int (*ptr)[10]`这样的声明,可以先解析最内部的`[10]`表示数组,接着`(*)`表示指针,最后`int`表示基础类型。因此,`ptr`是指向包含10个整数的数组的指针。 **1.8 函数只定义了一次,但为何编译器提示非法重定义?** 这种情况通常是由于在多个源文件中定义了同一个函数。确保每个函数只在一个源文件中定义,并在其他文件中仅声明该函数即可避免此类错误。 **1.9 `main()`的正确定义是什么?`void main()`正确吗?** `main()`函数是程序的入口点。C标准规定`main`函数应该有两个参数:`int argc`和`char *argv[]`。因此,推荐使用`int main(int argc, char *argv[])`的形式。`void main()`不是标准的C语言语法。 **1.10 对于没有初始化的变量的初始值可以作怎样的假设?** 未初始化的局部变量的值是未定义的。全局变量如果没有显式初始化,则会被自动初始化为零。对于全局指针变量,初始化为零意味着它是一个空指针;对于浮点数,则为0.0。 **1.11 为什么代码`int f() { char a[] = "Hello, world!"; }`不能编译?** 这段代码试图在函数内部定义一个静态字符串。在局部作用域中,不能定义具有静态存储持续期的变量。解决方法是在函数外部定义字符串,或者将其改为动态分配。 **1.12 这样的初始化有什么问题?`char *p = malloc(10);` 编译器提示“非法初始式”。** 使用`malloc`分配内存后,需要将返回的指针显式赋给一个指针变量。正确的写法是: ```c char *p; p = malloc(10); ``` 还需要注意,`malloc`返回的是`void *`类型的指针,因此在赋值给`char *`之前需要进行类型转换。 **1.13 以下的初始化有什么区别?`char a[] = "string literal";` 和 `char *p = "string literal";`** `char a[] = "string literal";`定义了一个包含字符串的字符数组。`char *p = "string literal";`定义了一个指向字符串的常量指针。尝试修改通过`p`指向的字符串会导致未定义行为。 **1.14 如何初始化函数指针?** 初始化函数指针时,可以使用`(*function_pointer)(...) = some_function;`的形式,其中`some_function`是要指向的函数名。例如: ```c int (*func_ptr)(int) = my_function; ``` 以上问题涵盖了C语言中声明和初始化的基础部分,理解这些问题对于编写高效、可靠的C程序至关重要。接下来的部分将继续探讨更多关于结构体、联合和枚举的相关知识。
剩余152页未读,继续阅读
- 粉丝: 24
- 资源: 54
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助