C 语言编程问答
什么是指针指向指针?
它是一个指针变量,可以保存另一个指针变量的地址。它两次取消引用,指向指定指针变量所持有的数据。
例如:int x = 5, *p=&x, **q=&p;
因此,x' 可以通过 **q 访问。
区分 malloc() 和 calloc() 内存分配。
两者都从堆区域/动态内存中分配内存。默认情况下,calloc 会用 0 填充分配的内存。
关键字 auto 的用途是什么?
默认情况下,函数的每个局部变量都是自动 (auto)。在下面的函数中,变量 i' 和 j' 都是自动变量。
void f() { int i; auto int j; }
注意:全局变量不能是自动变量。
关键字 break 的有效位置是什么?
break 只能出现在循环控制语句和 switch 语句中。break 的作用是将控制语句从上述代码块中带出。
解释 for 循环的语法。
for(expression-1;expression-2;expression-3) { //语句集 }
当程序控制到达表达式 1 时,首先执行表达式 1。然后执行表达式 2。如果表达式 2 的计算结果为非零语句集,且表达式 3 已执行,则执行表达式 2。
使用尖括号 < > 和双引号 " " 包含头文件有什么区别?
如果使用 < > 包含头文件,则编译器仅在内置包含路径中搜索特定的头文件。如果使用 " " 包含头文件,则编译器首先在当前工作目录中搜索特定的头文件,如果未找到,则在内置包含路径中搜索。
负整数的存储方式。
获取同一个正整数的补码。例如:1011 (-5)
步骤 1 − 5 的补数:1010
步骤 2 − 将上述结果加 1,得到 1011,即 -5
什么是静态变量?
静态局部变量在函数调用期间保持不变,默认值为 0。以下函数如果被调用三次,将打印 1 2 3。
void f() { static int i; ++i; printf("%d ",i); }
如果全局变量是静态的,则其可见性仅限于相同的源代码。
什么是 NULL 指针?
指向任何内容的指针被称为 NULL 指针。例如:char *p=NULL;
外部存储说明符的用途是什么?
用于解析全局符号的作用域。
Eg: main() { extern int i; Printf("%d",i); } int i = 20;
解释函数 sprintf() 的用途。
将格式化的输出打印到字符数组中。
数组基址的含义是什么?
数组的起始地址称为数组的基址。
何时应该使用寄存器存储说明符?
如果一个变量使用频率最高,那么应该使用寄存器存储说明符声明它,这样编译器可能会将变量存储在 CPU 寄存器中,以加快变量的查找速度。
S++ 或 S = S+1,推荐使用哪个指令将值加 1,为什么?
S++,因为它内部是单条机器指令 (INC)。
什么是悬垂指针?
指针最初持有有效地址,但后来持有的地址被释放或释放。那么,这样的指针就称为悬垂指针。
关键字 typedef 的用途是什么?
它用于为现有类型添加别名。也用于简化类型的复杂声明。
什么是左值和右值?
赋值运算符右侧的表达式称为右值。右值被赋值给赋值运算符左侧的左值。左值应该指向一个变量,而不是常量。
实际参数和形式参数有什么区别?
在调用端传递给函数的参数称为实际参数,而在函数定义接收端传递给函数的参数称为形式参数。
没有 main() 函数,程序可以编译吗?
可以,但无法执行,因为执行需要 main() 函数定义。
声明 void 指针有什么好处?
当我们不知道指针变量将保存什么类型的内存地址时,我们会为其声明一个 void 指针。
自动变量存储在哪里?
默认情况下,每个局部变量都是自动变量,存储在堆栈内存中。
什么是嵌套结构?
包含另一个结构元素作为其成员的结构被称为嵌套结构。
变量声明和变量定义?
声明将类型与变量关联,而定义则将值赋给变量。
什么是自引用结构?
包含与结构指针变量相同的结构体称为自引用结构体。
内置头文件是否包含内置函数定义?
不包含,头文件仅声明函数。函数定义位于由链接器链接的库中。
解释模块化编程。
将程序划分为子程序(模块/函数)以实现给定任务是模块化方法。更通用的函数定义赋予了函数复用的能力,例如内置库函数。
什么是 token?
C 程序由各种 token 组成,token 可以是关键字、标识符、常量、字符串字面量或符号。
什么是预处理器?
预处理器是指示编译器在实际编译过程开始之前执行某些操作的指令。
解释 %i 格式说明符相对于 scanf() 的用法。
可用于输入所有支持格式的整数。
如何使用 printf() 系列函数打印 \(反斜杠)。
使用 \(反斜杠)对其进行转义。
switch 中的默认 case 是否需要 break?语句?
是的,如果它不是最后一个 case,并且我们不希望控制流在 default 之后流向下一个 case(如果有)。
何时使用 ->(箭头)运算符。
如果结构体/联合体变量是指针变量,则使用箭头运算符访问结构体/联合体元素。
什么是位域?
除了非标准大小之外,我们还可以使用位域创建不同大小的整数结构体成员。此类结构体大小会根据机器整数大小的倍数自动调整。
什么是命令行参数?
在执行程序时传递给 main() 函数的参数称为命令行参数。这些参数始终是保存在函数第二个参数(在 args 中)中的字符串,该参数是字符指针数组。第一个参数代表参数的数量(下面是数量)并由操作系统自动更新。
main( int count, char *args[]) { }
向函数传递参数有哪些不同的方式?何时使用哪种方式?
按值调用 − 我们仅将值作为参数传递给函数。如果我们不想用形式参数修改实际参数,而只是使用实际参数,则选择这种方式。
按引用调用 − 我们发送实际参数的地址而不是值。如果我们确实希望用形式参数修改实际参数,则选择这种方式。
内置 stricmp() 函数的用途是什么?
它通过忽略大小写来比较两个字符串。
描述文件打开模式"w+"。
打开文件进行读写操作。如果文件不存在,则会创建一个;如果文件已存在,则会覆盖该文件。
取地址运算符 (&) 不能在哪些地方使用?
它不能用于常量。
它不能用于使用寄存器存储类声明的变量。
FILE 是内置数据类型吗?
不是,它是在 stdio.h 中定义的结构体。5.0 % 2 的提示是什么?
错误,模运算符 (%) 的两个操作数中任何一个都不能是实数,这是无效的。
三元运算符有多少个运算符?
只有一个运算符,并且是条件运算符 (? : )。
哪个关键字用于执行无条件分支?
goto
什么是指向函数的指针?请给出它的一般语法。
保存函数引用的指针称为指向函数的指针。通常,它的声明方式如下。
T (*fun_ptr) (T1,T2); 其中 T 是任意日期类型。
一旦 fun_ptr 引用了一个函数,就可以使用指针调用该函数,如下所示。
fun_ptr(); [或] (*fun_ptr)();
解释逗号运算符 (,) 的用法。
逗号运算符可用于分隔两个或多个表达式。
Eg: printf("hi") , printf("Hello");
什么是 NULL 语句?
空语句是指没有可执行语句,例如 ;(分号)。
Eg: int count = 0; while( ++count<=10 ) ;
上述代码重复 10 次,但什么也没做。
什么是静态函数?
以 static 关键字为前缀的函数定义被称为静态函数。如果函数仅在同一源代码中调用,则应将其设置为静态函数。
使用 gcc 编译器编译包含数学库的程序时,应使用哪个编译器开关?
将选项 lm 用作 > gcc lm <file.c>
哪个运算符用于在下一行继续宏定义?
使用反斜杠 (\)。
E.g. #define MESSAGE "Hi, \ Welcome to C"
哪个运算符用于接收函数的可变个数参数?
省略号 () 也用于此目的。一般函数定义如下
void f(int k,) { }
以下代码片段有什么问题?
char *s1 = "hello",*s2 = "welcome"; strcat(s1,s2);
s1 指向一个字符串常量,无法更改。
哪个内置库函数可用于调整分配的动态内存的大小?
realloc().
定义一个数组。
数组是具有通用名称的相似数据项的集合。
什么是枚举?
枚举是具有名称的整型常量列表。枚举器使用关键字 enum 定义。
哪个内置函数可用于内部移动文件指针?
fseek()
什么是变量?
变量是名称存储。
谁设计了 C 语言?
Dennis M Ritchie。
C 语言是哪种编程语言的继承者?
B
ANSI 的全称是什么?
美国国家标准协会。
哪个运算符可用于确定数据类型或变量的大小?
sizeof
我们可以将浮点型变量赋值给长整型变量吗?
可以,但会损失小数部分。
068 是有效的八进制数吗?
不是,它包含无效的八进制数字。
如果关系运算符有返回值,它的返回值是什么?
如果表达式之间的关系为真,则返回值 1,否则返回 0。
按位运算符 XOR 如何工作?
如果两个对应位相同,则返回 0,否则返回 1。
什么是无限循环?
循环表达式重复执行,结果始终为真,例如
while(0 == 0) { }
不同作用域的变量可以同名吗?如果是,请举例说明。
属于不同作用域的变量可以具有相同的名称,如以下代码片段所示。
int var; void f() { int var; } main() { int var; }
局部变量和全局变量的默认值是什么?
局部变量的默认值是垃圾值,全局变量的默认值是 0。
指针可以访问数组吗?
通过保存数组基址的指针可以访问数组。
指针的有效操作有哪些?
指针上唯一允许的两种操作是
- 比较
- 加法/减法(不包括 void 指针)
字符串的长度是多少?
它是字符的数量(不包括 \0 字符)。
将一个字符串附加到另一个字符串的内置函数是什么?
strcat() 来自头文件 string.h
哪个运算符可用于访问联合元素联合变量是否是指针变量?
箭头运算符 (->)。
解释一下 stdin。
stdin 是一个指针变量,默认情况下,该变量由标准输入设备打开。
说出一个可用于关闭文件流的函数。
fclose()。
#undef 预处理器的用途是什么?
它用于取消定义现有的宏定义。
定义一个结构体。
可以定义一个由异构数据项组成的集合。
说出一个预定义的宏,该宏用于确定您的编译器是否符合 ANSI 标准?
__STDC__
什么是类型转换?
类型转换是一种将变量/常量从一种类型转换为另一种类型的方法。
什么是递归?
函数调用自身称为递归。
哪个函数可用于释放动态分配的内存?
free()。
相对于命令行参数,参数向量中的第一个字符串是什么?
程序名称。
如何使用 fopen() 函数判断文件是否成功打开?
如果失败,fopen() 返回 NULL,否则打开成功。
链接器生成的输出文件是什么?
链接器生成可执行文件。
标识符的最大长度是多少?
理想情况下为 32 个字符,并且取决于具体实现。
默认的函数调用方式是什么?
默认情况下,函数通过值调用。
函数必须且应该声明。对此发表评论。
如果在定义后调用函数,则函数声明是可选的。
宏何时展开?
在预处理时。
函数可以使用 return 保留字向调用者返回多个值吗?
不可以,只能向调用者返回一个值。
什么是常量指针?
指针持有一个地址后,不允许被修改为持有另一个地址。
要使指针通用,需要声明哪种日期类型?
void
结构体变量可以在声明后立即初始化吗?
可以,但仅限于结构体元素的顺序。
有没有办法比较两个结构体变量?
没有。我们需要逐个比较结构体变量的元素。
哪个内置库函数可用于匹配字符串中的模式?
Strstr()
远指针和近指针有什么区别?
首先,它们是非标准关键字。近指针只能访问 2^15 的内存空间,而远指针可以访问 2^32 的内存空间。这两个关键字都是特定于实现的,并且是非标准的。
我们可以在 C 代码中嵌套注释吗?
不可以。
如果需要执行一组固定次数的语句,建议使用哪种控制循环?
for 循环。
什么是常量?
无法修改的值称为常量。此类变量需要使用关键字 const 进行限定。
我们可以只使用结构体的标签名来声明其变量吗?
不可以,我们需要同时使用关键字 struct' 和标签名。
main() 函数可以留空吗?
可以,程序可能什么都不做。
一个函数可以调用另一个函数吗?
可以,任何用户定义的函数都可以调用其他函数。
除了 Dennis Ritchie 之外,C 语言设计的另一个贡献者。
Brain Kernighan