(一定要看遍书,名词解释看着记)
1.什么是C语言?
C语言是一门面向过程、抽象化的通用程序设计语言,广泛应用于底层开发。
2.说一下C语言的三个基本结构化程序设计方法?
1>顺序结构:是最基本的一种结构,执行顺序是按照从上到下的顺序执行就行了
2>选择结构:当我们再执行下一个语句之前根据一个条件做出判断,选择下面的那一条语句或那一段语句,分支的概念也由此产生。
3>循环结构:当我们需要重复处理一点相同逻辑的代码时,就可以采用循环结构,这样可以大大减少代码量
3.C与C++的区别是什么?
C语言是一种面向过程的语言,面向过程是指我们如果解决一个问题,就要设计他的步骤,并且按着这个步骤一步一步的实现,然后完成这个事件,它是以事件为中心的编程思想
C++是一种面向对象的程序设计语言,面向对象是指我们编程时把事件分解成多个对象,每个对象有不同的属性和行为,然后他们之间怎么去实现这些行为然后实现整个事件。
具体:
关键字不同(32、63)、后缀名不同(.c、.cpp)、返回值不同、参数列表、缺省参数(c不支持)、函数重载(没有、有)。
4.面向过程与面向对象的区别?
面向过程是直接将解决间题的步骤分析出来,然后用函数把步骤━步一步实现,然后再依次调用就可以了.
面向对象是将构成问题的事物分解成若干个对象,建立对象的目的不是为了完成一个步骤,而是为了描述某个事物在解决问题过程中的行为。
5.指针和数组的关系?
利用一个指针可以去操作一个数组,但是指针是一个可以变化的变量,可以实现自加自减的操作,但是数组是不可以这样操作的,数组一经定义就不能改变了,只能进行数组与数组之间长度相加。
6.指针中的*号是什么意思?
C语言中,*在定义的时候,只是说明我要定义一个指针了。
*在非定义的时候,表示取后面那个地址里面的内容。
7.模块化编程的好处?
把一个多功能的复杂的程序划分为若干个简单的功能单一的程序模块,有利于程序的优化和分工,提高程序的阅读性和可靠性。
8.C语言的主要特点?
语言简洁,使用方便灵活,运算简单,数据类型丰富,允许直接访问物理地址,编程可移植性好。
程序总是从main函数开始执行,数据声明和语句最后必须有分号。
9.C程序的发展步骤?
.c上机输入和编辑源程序--->.obj对源程序进行编译-->.exe进行连接处理
C程序的运行一般要经历四个步骤。即源程序的编辑、源程序的编译、目标程序的链接和可执行程序的运行。
10.C语言中三个基本结构的共同点是?
顺序结构,选择结构,循环结构
对每一个框来说,都应当有一条从入口到出口的路径通过它。结构内不存在“死循环”。
11.从C语言执行效率方面,简述C语言采取了哪些措施提高效率?
1>使⽤指针;
2>使⽤宏函数;
3>使⽤位操作:位操作可以减少除法和取模的运算。
4>长内短外嵌套循环;
5>使用汇编指令、调用系统API、条件编译、使用寄存器变量、不检查数组下标
12.C语言的主要用途是什么?
作为一种系统程序设计语言,C语言已经广泛用于编写有关的系统软件,如操作系统、编译系统等;
作为一种应用程序设计语言,C已广泛用于编写各种应用软件,如数据库管理软件、CAD/CAM软件、文字处理软件、图形软件等。
13.C语言中十进制、八进制、十六进制整型常量是如何表示的?
十进制直接表示。以数字0开头的数是八进制数。以0x开头的数是十六进制数。
14.变量,常量,常变量,标识符介绍
变量是在程序运行期间,变量的值是可以改变的
常量是在程序运行过程中,其值不能被改变的量
常变量:const就是用来限定一个变量不允许被改变的
标识符:给对象付一个名字。C语言规定标识符只能由字母、数字和下划线3种字符组成,且第一个字符必须为字母或下划线。
15.C语言数据类型?
1>基本类型(包括整型和浮点型)
2>枚举类型
3>空类型
4>派生类型(指针类型、数组类型、结构体类型、共用体类型、函数类型)
16.C语言中常见的语句
1>控制语句:if、switch、for、while、do…while、continue、break、return、goto等
2>函数调用语句
3>表达式语句
4>空语句
5>复合语句
17.C语言中为什么规定对所用到的变量“先定义,后使用”,这样做有什么好处?
不同类型的变量,其编码表示方式可能不同;
不同类型的变量,其占有的空间大小不同。
1>便于纠错;
2>便于编译系统为变量分配存储空间;
3>运算合法性检查;
18.什么是预编译?何时需要预编译?
预编译又称为预处理,是做些代码文本的替换工作。c语言提供的预处理功能主要有以下三种:1)宏定义 2)文件包含 3)条件编译。
可以进行预编译情况:
1>总是使用不经常改动的大型代码体。
2>程序由多个模块组成,所有模块都使用一组标准的包含文件和相同的编译选项。
19.C语言中逻辑运算符的优先级?
!(逻辑非)、&&(逻辑与)、||(逻辑或)
20.运算符之间的优先级
熟(算术运算符)悉(关系运算符)继(逻辑运算符,除!)父(赋值运算符)
21.循环结构及其特点
while循环,do—while循环,for循环
1)while循环的特点是:先判断条件表达式,后执行循环体语句。
2)do—while语句的特点是:先无条件地执行循环体,然后判断循环条件是否成立 。
3)相比起while语句和do—while语句实现循环,for语句更为灵活,不仅可以用于循环次数已经确定的情况,还可用于循环次数不确定而只给出循环结束条件的情况,它完全可以代替while语句。
22.改变循环执行状态的语句
continue句只结束本次循环,而不是终止整个循环的执行;break语句结束整个循环过程,不再判断执行循环的条件是否成立。
23.局部变量和全局变量的区别?分别是怎么实现的?操作系统和编译器是怎么知道的?区别:
1>全局变量的生命周期是整个程序运行的时间,而局部变量的生命周期则是局部函数或过程调用的时间段。
2>全局变量的作用域为“整个工程”,局部变量作用域则为从定义的位置开始,到定义它的右花括号结束,只在函数执行期间存在,函数的一次调用执行结束后,变量被撤销,其所占用的内存也被收回。
3>全局变量存储在全局区,而局部变量存储在栈区。
他们的实现是由编译器在编译时采用不同内存分配方法。
全局变量在main函数调用后,就开始分配空间,(静态变量则是在main函数前就已经初始化了)。局部变量则是在用户栈中动态分配空间。
24.如何不使用第三个变量,将两个变量的值交换?
采用位运算的异或。
25.常量分为哪些? ‘
整型常量、实型常量和字符型常量和字符串常量,定义常量,符号常量等。
26.C语言中存储类型有哪些?简要描述。
C语言中的存储类型有auto, extern, register, static 这四种。
auto只能用来标识局部变量的存储类型;
extern用来声明在当前文件中引用在当前项目中的其它文件中定义的全局变量;
声明为 register的变量在由内存调入到CPU寄存器后,则常驻在CPU的寄存器中,因此访问register变量将在很大程度上提高效率,因为省去了变量由内存调入到寄存器过程中的好几个指令周期;
被声明为静态类型的变量,无论是全局的还是局部的,都存储在全局区中,其生命周期为整个程序。
27.字符常量与字符串常量有什么区别?
字符常量和字符串常量的表示方法不同,字符常量是用单引号括起来的一个字符,字符串常量是用一对双引号括起来的0个或者多个字符组成的序列。
最主要的区别是存储的不同:字符型数据在存储时,并不是把该字符本身放到内存单元中,而是把该字符的相应ASCII码值存放到该存储单元中;而字符串常量是将字符存储,并自动在其末尾加上‘\0’作为字符串结束的标志,所以字符串常量在内存中所占用的字节数为字符串长度+1。
28.关键字const有什么作用?
定义const常量,只具有可读性,防止被修改,增加程序健壮性,便于类型检查,节省时间提高效率。
29.关键字volatile有什么含义,试举例?
一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。下面是volatile变量的几个例子:
1). 并行设备的硬件寄存器(如:状态寄存器)
2). 一个中断服务子程序中会访问到的非自动变量(Non-automatic variables)
3). 多线程应用中被几个任务共享的变量
30.为什么使用符号常量?
1)简化书写格式、减少出错率。
2)定义符号常量可以提高程序的可读性,便于程序的调试和修改。
3)符号常量不同于变量,在其作用域内不能被改变和重新赋值。
4)习惯上人们把符号常量名用大写字母表示,变量用小写,以示区别。
31.什么是函数?有什么作用?
函数就是 C 语言中实现某种功能的模块,有较强的独立性,可以相互调用。
提高代码的复用率,减少代码冗余,提高程序模块化组织性。
32.函数的划分,定义
1>函数的划分:按照用户使用角度划分(库函数,自定义函数);按照函数形式的
划分(无参函数,有参函数)
2>函数的定义:C语言要求,在程序中用到的所有函数,必须“先定义,后使用”。在定义时指定函数名字,类型,返回值类型,参数的名字和类型,函数的功能;对于C编译系统提供的库函数,只需用#include指令把有关的头文件包含到本文件模块中即可。
3>函数声明要在函数使用之前,一般放在头文件中。
33.什么是库函数?有哪些库函数?
c语言标准规定的库函数或者编译器特定的库函数。数学函数、输入输出函数、字符串函数、字符 处理函数等
34.Void关键字的用途?
void是空类型, void的作用在于:
(1)对函数返回的限定。(2) 对函数参数的限定。
35.C语言以函数为程序的基本单位,有什么好处?
函数是程序的基本组成单位,利用函数不仅可以使程序模块化,而且可以使程序设计的简单和直观,提高程序的可读性和可维护性。
36.局部变量和全局变量能否重名?
能,局部会屏蔽全局。要用全局变量,需要使用"::"。
37.如何引用一个已经定义过的全局变量?
可以用引用头文件的方式,也可以用extern关键字。如果用引用头文件方式来引用某个在头文件中声明的全局变量,假定你将那个变量写错了,那么在编译期间会报错,如果你用extern方式引用时,假定你犯了同样的错误,那么在编译期间不会报错,而在连接期间报错。
38.全局变量可不可以定义在被多个.c文件包含的头文件中?为什么?
可以,在不同的C文件中以static形式来声明同名全局变量,前提是其中只能有一个C文件中对此变量赋初值,此时连接不会出错。
39. 函数的实参和形参有什么区别?
形参变量只有在函数被调用时才会分配内存,调用结束后,立刻释放内存,所以形参变量只有在函数内部有效,不能在函数外部使用。
实际参数变量可以是常量、变量、表达式、函数等,在进行函数调用时,它们都必须有确定的值, 以便把这些值传送给形参。函数调用过程是单向的,形参的改变不会影响到实参。
40.内部函数与外部函数的区别?
如果一个函数只能被本文件中的其他函数调用,则成为内部函数,也成为静态函数,在定义内部函数时,函数名和函数类型前加static,作用域只局限于所在文件。
除内部函数外,其余的函数都可以被其他文件中的函数调用,为外部函数。
41.函数声明的作用?
函数声明的作用是:把函数的名字、函数类型及形参类型、个数和顺序通知编译系统,以便在调用该函数时系统按此进行对照和检查。
42.描述一下strcmp(a,b)函数?
比较函数。a>b返回正数,a=b返回0,a<b返回负数。
43.关键字和一般标识符有什么区别?
标识符用来标识源程序中的某个对象的名字,一个标识符由字母、数字和下划线组成。关键字可以定义变量、表达式语句功能和对一些文件进行预处理,关键字已被编译系统本身使用,所以用户编写程序时不能够使用这些关键字来作为标识符,如int,if,for
44.谈谈对左移操作符和右移操作符的理解?
左移操作符:二进制位左移,右端补0;
右移操作符:
算术右移:二进制位右移,左端补原符号位;
逻辑右移:二进制位右移,左端补0;
45.goto语句怎么使用?
goto语句可以跳转到函数中任何有标号的语句处。
语法结构:执行语句goto 标识符Q;
控制会转移到标号Q后面的语句中,而且要注意的是该语句必须和goto语句在同一个函数中。
46.简述default子句?
当switch表达式的值并不匹配所有的case标签的值时,这个default子句后面的语句就会执行。所以,每个switch语句中只能出现一条default子句。但是它可以出现在语句列表的任何位置,而且语句流会像贯穿一个case标签一样贯穿default子句。
47.Const与#define相比,有什么优点?
Const作用:定义常量、修饰函数参数、修饰函数返回值三个作用。被Const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。
1) const 常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查。而对后者只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不到的错误。
2) 有些集成化的调试工具可以对const常量进行调试,但是不能对宏常量进行调试
48.逻辑与与按位与有什么区别?逻辑或与按位或有什么区别?
按位与&和按位或|对操作数进行求值运算,逻辑与&&和逻辑或||只是判断逻辑关系。 逻辑与&&和逻辑或||在判断左侧操作数确定结果的情况下就不再对右侧操作数求值。
49.请简述C语言的隐式类型转换发生的四种情况,并说明每种情况如何转换?
1>算术运算式中,低类型能转换为高类型。
2>赋值表达式中,右边表达式的值自动隐式转换为左边变量的类型,并赋值给它。
3>函数调用中参数传递时,系统隐式地将实参转换为形参的类型后,赋给形参。
4>函数有返回值的时候,系统隐式的将返回表达式类型转换为返回值类型,赋给调用函数。
50.Sizeof和strlen有什么区别?
strlen 是一个函数,它用来计算指定字符串的长度,但不包括结束字符。
关键字 sizeof 是一个单目运算符,而不是一个函数。与函数 strlen 不同,它的参数可以是数组、 指针、类型、对象、函数等,他所求的为所占内存空间,而不是实际长度。
51.关键字typedef和#define有什么区别?
1>用法不同:typedef 用来定义一种数据类型的别名,增强程序的可读性。define 主要用来定义常量,以及书写复杂使用频繁的宏量。
2>执行时间不同:typedef 是编译过程的一部分,有类型检查的功能。define 是宏定义,是预编译的部分,其发生在编译之前,只是简单的进行字符串的替换,不进行类型的检查。
3>作用域不同:typedef 有作用域限定。define 不受作用域约束,只要是在 define 声明后的引用都是正确的。
4>对指针的操作不同:typedef 和 define 定义的指针时有很大的区别。
5>typedef 定义是语句,因为句尾要加上分号。而 define 不是语句,千万不能在句尾加分号。
52.关键子static有什么作用?
第一:修饰局部变量,static修饰局部变量改变了变量的生命周期让静态局部变量出了作用域依然存在,到程序结束,生命周期才结束。本质上改变了变量的存储类型,将存储在栈区的局部变量转移到静态区。
第二:修饰全局变量,一个全局变量被static修饰,使得这个全局变量只能在本源文件内使用,不能在其他源文件内使用。因为全局变量具有外部链接属性,但被static修饰以后,就变成了内部链接属性。
第三:修饰函数,一个函数被static修饰,使得这个函数只能在本源文件内使用,不能在其他源文件内使用。因为函数具有外部链接属性,但被static修饰以后,就变成了内部链接属性。
53.函数的嵌套调用和递归调用有什么区别?
函数嵌套允许在一个函数中调用另外一个函数,递归调用是调用本身的函数。函数嵌套就是函数调用函数,是普遍的,递归就是函数调用自身,是函数嵌套的一个特例。
54.传值调用和传址调用的区别?
传值调用将实参的数据(而不是地址)传给了形参,在被调用的函数中,形参值改变了,但是不影响主调函数的实参值。数值传递方向是由实参向形参单向传递。
传址调用与传值调用不同,传址调用是将实参变量的地址传给形参,改变形参的同时也把实参改变了。
55.指针数组和数组指针的区别?
指针数组可以说成是”指针的数组”,首先这个变量是一个数组,其次,”指针”修饰这个数组,意思是说这个数组的所有元素都是指针类型。
数组指针可以说成是”数组的指针”,首先这个变量是一个指针,其次,”数组”修饰这个指针,意思是这个指针指向一个数组的首地址。
56.指针函数和函数指针的区别?
指针函数:是一个函数,返回值是一个指针,要注意返回的这个指针不能是局部变量。
函数指针:是一个指针,是一个指向函数的指针,是调用函数的入口。
57.什么是野指针?成因?
野指针通俗的讲就是格式不规范,有问题的指针。按书上的说就是指针指向的位置是不可知的
成因:
1>指针未初始化;
2>指针越界访问;
3>指针指向的空间释放;
58.如何规避野指针?
1>指针初始化;
2>小心指针越界;
3>避免指针指向的空间为已释放的空间;
4>指针使用之前检查有效性;
59.数组越界后果?
越界访问有可能把数据放到已经存储了重要数据的内存单元,也就是改写了本来不许改写的数据。有可能导致系统运行紊乱甚⾄是崩溃。
避免的办法是对数组的下标严格检测,判断数组下标是否越界。
60.指针和地址有什么联系?在使用指针的过程中应注意哪些细节?指针类型对于程序设计有哪些意义?
指针保存了某个变量的地址。
注意细节:要初始化、正确的传递地址方式、使用时要判断。
指针可以用来有效地表示复杂的数据结构,可以用于函数参数传递并达到更加灵活使用函数的目的,使C语言程序设计具有灵活、实用、高效的特点。
61.引用与指针的区别?
引用必须被初始化,引用初始化以后不能被改变,指针不要求必须初始化。指针可以改变所指的对象,不存在指向空值的引用,但是存在指向空值的指针。
62.值传递和地址传递的区别?
值传递只是把变量的值当做参数传递进子函数中,无论函数体中如何改变参数值,主函数的变量值都不会改变。
而地址传递,是把变量的地址传入子函数中,子函数中对于参数的改变,是通过传入的地址参数去内存中修改该变量存储的值,所以主函数中的变量值也会同步改变。
63.字符指针、浮点数指针以及函数指针这三种类型的变量哪个占用的内存最大?为什么?
一样大。指针变量只需要存储一段内存单元的首地址。指针变量的大小由机器位数决定,无论是哪种数据类型,都是用32/64位表示,所以占用内存一样大。
64.结构体与共同体的区别?
结构体的各个成员会占用不同的内存,互相之间没有影响;而共用体的所有成员占用同一段内存,修改一个成员会影响其余所有成员。
结构体占用的内存大于等于所有成员占用的内存的总和,共用体占用的内存等于最长的成员占用的内存。
C语言的结构体和共同体由两个关键词进行定义:struct和union。
65.解释局部变量、全局变量和静态变量的含义?
局部变量:作用域范围有效的变量;
全局变量:作用域范围全局下有效(不属于任何一个{ }大括号);
静态变量:生命周期是全局,作用域仍然有限,在哪个{ }大括号里定义的,只能在哪个大括号里使用,但是作用域范围不会被释放,直到程序结束后才会被释放;
66.结构体类型?
结构体是一个可以包含不同数据类型的一个结构,它是一种可以自己定义的数据类型。
特点:1、结构体可以在一个结构体中声明不同的数据类型;
2、相同的结构的结构体变量可以相互赋值;
3、节省内存空间。
4、高效率。
67.内存分配的三种方式?
1>从静态存储区域分配。例如全局变量,static变量。
2>在栈上创建。
3>从堆上分配,亦称动态内存分配。
68.什么是文件?C语言中的文件如何分类?
文件:是指存储在外部介质上一组相关数据的集合。 分类:根据文件的组织形式,文件可以分为ASCII文件和二进制文件。
69.堆和栈的概念和区别?
栈由编译器自动分配释放,存放函数参数值,局部变量的值等。堆一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。
栈内存存储的是局部变量而堆内存存储的是实体;栈内存的更新速度要快于堆内存,因为局部变量的生命周期很短;栈内存存放的变量生命周期一旦结束就会被释放,而堆内存存放的实体会被垃圾 回收机制不定时的回收。
70.什么是算法?算法有哪些特性?
算法:程序按指定的次序执行一系列操作解决问题的过程描述称为算法。 算法的特性:
(1)有穷性;(2)确定性;(3)有零个或多个输入;(4)有一个或多个输出;(5)有效性。
71.类与结构体有什么区别?
1>结构体存储在栈中,类的实例化可以存储在栈中,也可以存储在堆中;
2>结构体的执行效率比类要高;
3>结构体没有析构函数,类有析构函数;
4>结构体不可以继承,类可以继承。
72.堆栈溢出一般是由什么原因导致的?
1>没有回收垃圾资源。
2>层次太深的递归调用
73.怎样区分表达式和表达式语句?为什么有人称C为表达式语言?
表达式不是独立存在的,它存在于其它表达式、语句、函数参数里,表达式后面加上一个分号,就变成表达式语句。
由于C程序中大多数语句是表达式语句(包括函数调用语句),所以有人把C语言称作“表达式语言”。
74.算法有哪些描述方法?各有什么优缺点?
(1)自然语言(2)伪代码(3)流程图(4)计算机语言
优缺点:
自然语言通俗易懂,但有歧义性;
伪代码方便实用,但没有流程图明晰,容易犯逻辑错误;
流程图明晰但绘制和修改时比较繁琐;
计算机语言表示算法严谨,但无法做到算法设计的第一步就使用计算机语言,读程序比看流程图要费神很多。
75.举例说明文本文件和二进制文件的适用场合。
1>能存储的数据类型不同:
文本文件只能存储char型字符变量。
二进制文件可以存储char/int/short/long/float/…各种变量值。
2>每条数据的长度:
文本文件每条数据通常是固定长度的。
二进制文件每条数据不固定。
3>读取的软件不同:
文本文件编辑器就可以读写。
二进制文件需要特别的解码器。