C语言问题集:函数返回多值与变量初始化

需积分: 0 0 下载量 65 浏览量 更新于2024-07-26 收藏 976KB PDF 举报
"495个C语言问题" 在C语言中,函数通常只能返回一个值,但如果需要从一个函数返回多个值,有几种方法可以实现。首先,可以通过传入多个指针作为参数,让函数将结果分别写入这些指针所指向的内存位置。例如: ```c void getValues(int* val1, int* val2) { *val1 = 10; *val2 = 20; } int main() { int a, b; getValues(&a, &b); // 现在 a 和 b 分别被赋予了函数返回的值 return 0; } ``` 其次,可以创建一个结构体来封装多个值,并让函数返回这个结构体的实例。例如: ```c typedef struct { int value1; float value2; } MultipleValues; MultipleValues getMultipleValues() { MultipleValues result; result.value1 = 10; result.value2 = 3.14; return result; } int main() { MultipleValues values = getMultipleValues(); // 现在 values 包含了函数返回的多个值 return 0; } ``` 另外,虽然不推荐,但在某些情况下可以使用全局变量来实现返回多个值,但这会引入线程安全和代码可读性的问题。 在C语言中,整数类型(如int, short, long, long long)的选择通常基于所需表示的数值范围以及平台的字长。在64位系统上,64位整型通常是`long`或`long long`,但具体取决于实现。为了跨平台兼容,可以使用`stdint.h`头文件中的固定宽度类型,如`int32_t`和`int64_t`。 `extern`关键字在函数声明中表明该函数是在其他地方定义的,而不是在当前文件中。而在变量声明中,`extern`表示变量是在其他地方定义的,需要在这里声明以便于使用。 `auto`是C语言中的一个存储类说明符,通常用于函数内部的局部变量声明,但现代C++中已不再常用,因为默认情况下函数内的变量就是自动存储类型。 在链表定义中,结构体可以包含指向自己的指针,这允许构建递归数据结构,例如自引用的节点。 复杂声明的理解可以通过从右向左的规则进行,例如,一个指向返回指向字符的指针的函数的指针的数组可以写作: ```c typedef int (*func_ptr)(int); func_ptr array[N]; ``` `main()`函数的正确定义通常是`int main(void)`或`int main(int argc, char* argv[])`。`void main()`在C标准中未定义,不应使用。 未初始化的变量的值是不确定的,不应依赖它们的初始值。全局变量默认不初始化的值可能是零,但不是必须的。局部变量则完全不确定。 数组初始化如`char a[]="stringliteral";`是直接复制字符串字面量,而`char* p="stringliteral";`则是赋值一个字符串常量的地址。尝试修改`p[i]`会导致未定义行为,因为字符串字面量是只读的。 函数指针的声明和初始化可以通过以下方式完成: ```c typedef int (*func_ptr)(int, int); func_ptr my_func = some_function; ``` 结构、联合和枚举是C语言中定义复杂数据类型的重要工具。结构可以包含指向自己的指针,实现递归结构。抽象数据类型的实现通常涉及结构体和相关的操作函数。C语言本身不支持面向对象编程,但可以通过模拟实现类似的概念,如结构体作为类,函数指针作为方法。