C语言面试试题集锦:指针、循环、内存操作等

需积分: 9 0 下载量 89 浏览量 更新于2024-09-09 收藏 37KB DOC 举报
"C语言面试题集合,涵盖了指针、常量、内存操作、循环、数据类型比较、字节序判断、无参数交换、宏定义、数组操作等核心概念,适用于软件技术行业的面试准备。" 1. 在C语言中,变量a可以有不同的定义: a) `int a;` - 定义一个整型变量。 b) `int *a;` - 定义一个指向整型数的指针。 c) `int **a;` - 定义一个指向指针的指针,该指针指向的指针是指向一个整型数。 d) `int a[10];` - 定义一个包含10个整型数的数组。 e) `int (*a)[10];` - 定义一个数组,包含10个指向整型数的指针。 f) `int (*a)[10];` 或 `int *a[10];` - 定义一个指针,它指向一个包含10个整型数的数组。 g) `int (*a)(int);` - 定义一个指向函数的指针,该函数接受一个整型参数并返回一个整型数。 h) `int (*a[10])(int);` - 定义一个包含10个指针的数组,这些指针指向函数,函数接受一个整型参数并返回一个整型数。 2. 创建一个MIN宏,可以这样实现: ```c #define MIN(a, b) ((a) < (b) ? (a) : (b)) ``` 3. 使用C语言编写死循环,可以简单地写成: ```c for(;;) { // 无限循环体 } ``` 4. 关键字`const`表示常量,它可以修饰变量、指针和函数参数等,不同情况含义不同: - `const int a;` - a是一个不能修改的整型变量。 - `int const a;` - 等同于上一条。 - `const int *a;` - a是一个指向整型常量的指针,不能通过a修改所指的值。 - `int *const a;` - a是一个指向整型数的常量指针,指针本身不可变,但可以修改所指的值。 - `int const *a const;` - a是一个指向整型常量的常量指针,既不能修改指针,也不能修改所指的值。 5. 访问绝对地址0x67a9并设置为0xaa66,这通常涉及内存映射和汇编指令,但纯C语言下无法直接完成,因为ANSI C不支持直接的内存地址操作。在实际的嵌入式环境中,可能需要使用特定平台的API或内联汇编。 6. 函数`getmemory`分配了内存,但没有返回分配的地址,导致`test`函数中的`str`未初始化。正确的做法是让`getmemory`返回分配的指针: ```c void getmemory(char** p) { *p = (char*)malloc(100); } void test() { char* str = NULL; getmemory(&str); strcpy(str, "helloworld"); printf(str); } ``` 7. 比较bool、int、float和指针变量与"零值"的if语句: - `if (!bool_var)` - bool变量为假(0)时为真。 - `if (int_var == 0)` - int变量为0时为真。 - `if (float_var == 0.0)` - float变量等于0.0时为真,注意浮点比较需谨慎。 - `if (!pointer_var)` - 指针变量为NULL或未初始化时为真。 8. 判断处理器字节序,可以编写如下函数: ```c int is_little_endian() { union { int i; char c[4]; } test; test.i = 1; return test.c[0] == 1 ? 1 : 0; } ``` 如果返回1,则为little-endian,0则为big-endian。 9. 不用第三方参数交换两个整数a和b的值,可以使用位操作: ```c void swap(int* a, int* b) { *a = *a ^ *b; *b = *a ^ *b; *a = *a ^ *b; } ``` 10. `do...while`和`while...do`的区别在于,`do...while`先执行循环体再检查条件,至少执行一次;而`while...do`先检查条件,条件不满足则不执行循环体。 11. 在这段代码中,`*(a+1)`是第二个元素,输出为2,`*(ptr-1)`是数组最后一个元素,即5。输出为`2, 5`。`ptr`实际上指向了`a+1`的地址,因此`ptr-1`相当于`a`的地址。 12. 代码中的`#define MAX 255`会导致`for`循环超过数组边界,因为`i`可以取到255,而数组`A`的索引只到0-254,所以会导致数组越界。 13. 这段代码的问题在于,`strcpy`尝试将字符串复制到未初始化的指针`str`所指向的内存中,可能导致内存错误或程序崩溃。正确做法是确保`str`指向有效的内存区域,如调用`malloc`分配内存。