### 必须知道的C语言问题 #### 1. 声明和初始化 ##### 1.1 如何决定使用哪种整数类型? 在C语言中,选择合适的整数类型对于确保程序的效率和可移植性至关重要。通常情况下,`int`是最常用的整数类型,但在某些特定场景下,其他类型可能更为合适。例如: - **短整型(short int)**:占用较少的空间(通常为16位),适用于内存敏感的应用场景。 - **长整型(long int)**:提供更大的数值范围(通常为32位),适用于需要更大数值范围的情况。 - **长长整型(long long int)**:提供更广泛的数值范围(通常为64位),适用于极端大数的处理。 在64位系统上,`long`类型通常与`int`相同,都为64位;`long long`则也是64位,但具体实现可能会有所不同,因此最好查阅具体的编译器文档来了解这些类型的精确大小。 ##### 1.2 64位机上的64位类型是什么样的? 在64位系统上,常见的整数类型`int`和`long`通常是64位。此外,`long long`也可能是64位。具体来说: - `int`和`long`: 64位。 - `long long`: 64位或更高。 为了编写可移植的代码,建议使用`<stdint.h>`头文件中的固定宽度整数类型,如`int32_t`、`int64_t`等,它们分别代表32位和64位的带符号整数。 ##### 1.3 怎样定义和声明全局变量和函数最好? 定义全局变量时,应考虑其可见性和作用域: - 使用`static`关键字可以使变量仅在本文件内可见。 - 如果希望在其他文件中访问该变量,则应将其声明为`extern`,并在某个文件中实际定义它。 对于函数,最佳做法是在一个头文件中声明所有函数原型,并在实现文件中定义它们。这种方式提高了代码的组织性和可维护性。 ##### 1.4 `extern`在函数声明中是什么意思? `extern`关键字用于声明一个变量或函数,表明它是在另一个地方定义的。当在头文件中声明一个全局变量或函数时,通常会使用`extern`。例如: ```c extern int global_var; extern void some_function(); ``` 这样,在其他文件中可以通过包含这个头文件来访问`global_var`和`some_function`。 ##### 1.5 关键字`auto`到底有什么用途? `auto`关键字在C语言中主要用于声明变量时指定其存储类型。默认情况下,局部变量就是`auto`类型,因此在现代C编程实践中很少显式使用`auto`。例如: ```c auto int x = 10; ``` 这等同于: ```c int x = 10; ``` 在C99及之后的标准中,`auto`还可以用于声明变量时推导其类型,但这主要用于复合字面量中。 ##### 1.6 我似乎不能成功定义一个链表。我试过`typedef struct { char *item; NODEPTR next; } NODEPTR;` 但是编译器报了错误信息。难道在C语言中一个结构不能包含指向自己的指针吗? 在C语言中,定义指向结构本身的指针是完全可行的,但需要使用正确的语法。您提供的代码片段中有几个问题: 1. 结构名与指针类型名相同,这会导致混淆。 2. 指针类型名称不应该带有星号(`*`)。 正确的定义应该是: ```c typedef struct Node { char *item; struct Node *next; } Node; ``` 或者简写为: ```c typedef struct { char *item; struct Node *next; } Node; ``` 这样就可以创建指向结构的指针,并且结构体中可以包含指向自身的指针。 ##### 1.7 怎样建立和理解非常复杂的声明?例如定义一个包含N个指向返回指向字符的指针的函数的指针的数组? 理解复杂的声明的关键在于逐步分解声明。例如,要定义一个包含N个指向返回指向字符的指针的函数的指针的数组,可以这样写: ```c typedef char *(*FuncPtr)(); // 定义一个指向返回char*的函数的指针类型 FuncPtr (*array)[N]; // 定义一个包含N个FuncPtr的指针的数组 ``` 这里的步骤是: 1. 定义一个指向返回`char *`的函数的指针类型`FuncPtr`。 2. 定义一个指向包含N个`FuncPtr`的数组的指针`array`。 这种声明的顺序是从右向左解析的,理解每个类型修饰符所修饰的对象。 ##### 1.8 函数只定义了一次,调用了一次,但编译器提示非法重定义了。 这通常是因为同一个函数在多个文件中被定义。为了避免这种情况,确保每个函数只在一个文件中定义,并通过声明将其实现暴露给其他文件。例如,在头文件中声明: ```c // header.h void myFunction(); ``` 在源文件中定义: ```c // source.c #include "header.h" void myFunction() { // ... } ``` 在使用该函数的其他文件中包含头文件: ```c // main.c #include "header.h" int main() { myFunction(); return 0; } ``` 确保所有包含头文件的地方都有适当的`#ifndef`和`#define`保护,以避免重复定义。 ##### 1.9 `main()`的正确定义是什么?`void main()`正确吗? `main()`函数是程序的入口点,其正确定义应该是: ```c int main(void) { // ... return 0; } ``` 或 ```c int main(int argc, char *argv[]) { // ... return 0; } ``` `void main()`不是标准的C语言语法,虽然某些编译器可能支持它,但为了代码的可移植性和标准性,应使用`int main()`。 ##### 1.10 对于没有初始化的变量的初始值可以作怎样的假定?如果一个全局变量初始值为“零”,它可否作为空指针或浮点零? 未初始化的局部变量具有不确定的值。不应假定它们具有任何特定值。然而,未初始化的全局变量会被自动初始化为零(即`0`对于整数,`0.0`对于浮点数,`NULL`对于指针)。这意味着它们可以作为零值来使用,但为了清晰性和安全性,最好显式地初始化它们。 ##### 1.11 代码`int f() { char a[] = "Hello, world!"; }`不能编译。 这段代码试图在一个局部变量`a`中初始化一个字符串,这在C语言中是不允许的,因为字符串字面量是常量,不能放在局部数组初始化中。正确的做法是: - 使用`const char *a = "Hello, world!";` - 或者在全局作用域中初始化数组。 ##### 1.12 这样的初始化有什么问题?`char *p = malloc(10);` 编译器提示“非法初始式”。 `malloc`函数返回的是一个`void *`类型,需要显式转换成目标类型。此外,使用`malloc`分配的内存需要手动初始化。正确的初始化方法是: ```c char *p = (char *)malloc(10 * sizeof(char)); ``` 或者使用C99的复合字面量: ```c char *p = malloc(10 * sizeof(*p)); *p = '\0'; // 初始化为null终止字符串 ``` ##### 1.13 以下的初始化有什么区别?`char a[] = "stringliteral";` `char *p = "stringliteral";` 当我向`p[i]`赋值的时候,我的程序崩溃了。 `char a[] = "stringliteral";` 创建了一个包含字符串的字符数组,可以直接修改其中的内容。 `char *p = "stringliteral";` 创建了一个指向字符串字面量的指针,字符串字面量是常量,因此尝试修改它们会导致未定义行为或程序崩溃。 为了安全地修改字符串,应使用动态分配的内存: ```c char *p = strdup("stringliteral"); p[0] = 'A'; // 修改第一个字符 free(p); // 不要忘记释放内存 ``` ##### 1.14 我总算弄清楚函数指针的声明方法了,但怎样才能初始化呢? 函数指针的初始化与普通指针类似。假设有一个函数`func`,可以这样初始化一个指向它的指针: ```c void func() { /* ... */ } void (*fp)() = func; ``` 这里,`fp`是一个指向无返回值的函数的指针。 --- 以上是对C语言声明和初始化部分的详细解释,涉及了整数类型的选择、全局变量和函数的定义、复杂的声明解析等方面。后续部分将继续探讨更多关于结构体、联合体和枚举的相关知识点。
剩余152页未读,继续阅读
- 粉丝: 27
- 资源: 4
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 白色大气风格的孤儿院慈善网站模板.zip
- 白色大气风格的红唇少女女性类网站模板.zip
- 白色大气风格的户外景点旅游公司模板下载.zip
- 白色大气风格的豪车经销商模板下载.zip
- 白色大气风格的户外摄影工作室模板下载.zip
- 白色大气风格的户外旅游公司模板下载.zip
- 白色大气风格的户外旅行装备商城网站源码下载.zip
- 白色大气风格的婚礼布置现场企业网站模板下载.zip
- 白色大气风格的婚礼现场倒计时模板下载.zip
- 白色大气风格的婚礼网站模板下载.zip
- 白色大气风格的建筑商业网站模板下载.rar
- 白色大气风格的建筑设计公司模板下载.zip
- 白色大气风格的家用电器商城整站网站源码下载.zip
- 白色大气风格的健身私人教练模板下载.zip
- 白色大气风格的金融综合服务平台模板下载.zip
- 白色大气风格的景观设计HTML网站模板.zip