c语言自用

第一章 c语言基础

C语言:是一门面向过程、抽象化的通用程序设计语言,广泛应用于底层开发。(面向过程是直接将解决间题的步骤分析出来,然后用函数把步骤━步一步实现,然后再依次调用就可以了.面向对象是将构成问题的事物分解成若干个对象,建立对象的目的不是为了完成一个步骤,而是为了描述某个事物在解决问题过程中的行为。)

 算法:程序按指定的次序执行一系列操作解决问题的过程描述称为算法。 算法的特性:  (1)有穷性;(2)确定性;(3)有零个或多个输入;(4)有一个或多个输出;(5)有效性。

C程序的特点:C程序主要是由函数构成的;一个函数由函数首部和函数体构成;C程序总是从main中开始执行且从main中结束;每个语句和数据声明的最后必须有分号(;);C语言本身没有输入和输出语句;可以用“//对C程序中任何一行或数行做注释。C语言书写格式自由,一行内可以写多个语句,一个语句可以分多行写;

上机运行C程序的方法步骤
上机器输入和编辑源程序,对源程序进行编译,得到目标函数,将目标函数与数据库连接,得到可执行的目标程序,运行可执行的目标程序

机器语言:机器语言是机器能直接识别的程序语言或指令代码,无需经过翻译,每一操作码在计算机内部都有相应的电路来完成它,或指不经翻译即可为机器直接理解和接受的程序语言或指令代码。

高级语言:一种面向对象或者面向过程的语言,Java、c、c++、python都是高级语言

计算机由什么控制?为什么需要高级编程语言?
计算机由程序控制,高级语言接近人类自然语言和数学语言,容易学习和推广,不依赖具体计算机,通用性强。

机器语言和汇编语言与高级编程语言的区别?
机器语言和汇编语言依赖具体计算机,属于低级语言,难学难用,无通用性。高级语言接近人类自然语言和数学语言,容易学习和推广,不易赖有具体计算机,通用性强。

程序:就是一组能识别和执行的指令,每一条指令使计算机执行特定的操作,一组计算机能识别和执行的指令,运行于电子计算机上,满足人们某种需求的信息化工具

程序设计:是指从确定任务到得到结果、写出文档的全过程

源程序:指未编译的按照一定的程序设计语言规范书写的文本文件,是一系列人类可读的计算机语言指令

目标程序:为源程序经编译可直接被计算机运行的机器码集合,在计算机文件上以.obj作扩展名

可执行程序:将所有编译后得到的目标模块连接装配起来,在与函数库相连接成为一个整体,生成一个可供计算机执行的目标程序,成为可执行程序

预编译:又称为预处理,是做些代码文本的替换工作。c语言提供的预处理功能主要有以下三种:1)宏定义 2)文件包含 3)条件编译。

可以进行预编译情况:

  1>总是使用不经常改动的大型代码体。

  2>程序由多个模块组成,所有模块都使用一组标准的包含文件和相同的编译选项。

1.编辑:编写代码,制作C语言的源文件。上机输入或者编辑源程序。(源程序,后缀是.c)
2.编译:是由编译程序将C语言源文件转换成二进制中间文件。(先用C提供的“预处理器”,对程序中的预处理指令进行编译预处理,对源程序进行语法检查, 判断是否有语法错误,直到没有语法错误未知,编译程序自动把源程序转换为二进制形式的目标程序。)(产生目标文件,后缀是.obj)
3.链接:将编译中生成的中间文件组合成二进制可执知行文件。(产生可执行文件,后缀是.exe)
4.执行:运行可执行文件,这个是编写程序代码最终目的。

编辑好源代码后为什么还要进行编译才能执行?
由于C语言是高级编程语言,而计算机的底层是二进制的机器语言,且不同的设备之间的二进制语言不互通,因此我们需要通过编译将程序转化为机器语言,也可以通过不同的编译系统,适应不同的机器。


程序连接:将所有编译后得到的目标模块连接装配起来,在与函数库相连接成为一个整体的过程称之为程序连接

程序模块:可由汇编程序、编译程序、装入程序或翻译程序作为一个整体来处理的一级独立的、可识别的程序指令

程序文件:程序的文件称为程序文件,程序文件存储的是程序,包括源程序和可执行程序

函数:将一段经常需要使用的代码封装起来,在需要使用时可以直接调用,来完成一定功能

c语言的基本单位是函数。

主函数:又称main函数,是程序执行的起点。有且仅有一个主函数(main函数)。c语言程序是从main函数开始执行,到main函数的return 0结束。main函数里面语句块是用{}包括起来。main函数可以出现在程序的任意位置,不是一定出现在头部

被调用函数:由一个函数调用另一个函数,则称第二个函数为被调用函数

库函数:一般是指编译器提供的可在c源程序中调用的函数。可分为两类,一类是c语言标准规定的库函数,一类是编译器特定的库函数

程序调试:是将编制的程序投入实际运行前,用手工或编译程序等方法进行测试,修正语法错误和逻辑错误的过程

程序测试:是指对一个完成了全部或部分功能、模块的计算机程序在正式使用前的检测,以确保该程序能按预定的方式正确地运行

C语言数据类型有哪几类?基本数据类型包括哪几类?
C中的数据类型包括:基本类型、构造类型、指针类型、空类型等。
其中基本类型包括:整型、字符型、实型(浮点型)等。
构造类型包括:枚举型、结构体、共用体、数组

第二章 基本数据类型

C语言数据类型有哪几类?基本数据类型包括哪几类?
C中的数据类型包括:基本类型、构造类型、指针类型、空类型等。
其中基本类型包括:整型、字符型、实型(浮点型)等。
构造类型包括:枚举型、结构体、共用体、数组

标识符:在编程语言中,标识符是用户编程时使用的名字,变量、常量、函数、语句块都有名字。是用来标识某个实体的一个符号,是对变量名、函数名、标号和其他各种用户定义的对象命名。

1.标识符由字母、数字、下划线组成,并且首字母不能是数字(以字母和下划线_开头)。
2.不能把C的关键字作为用户的标识符,例如:for、static、while等等。
3.标识符长度是由机器上的编译系统决定的,一般的限制为8字符,(注:8字符长度限制是C89标准,C99标准已经扩充长度,其实大部分工业标准都更长)。
4.标识符对大小写敏感,即严格区分大小写。大小写字母表示不同名字
5.标识符命名应做到"见名知意",例如:temp(临时)、sum(求和)

整数:整数的存储方式是直接存储,如0001010

实数:实数采用指数形式存储,如124.5则储存为|+|,1245|+|3|

字符:字符则是以二进制直接存储,读写时通过计算机按照ASCII码转换,如65的二进制是1000001,在ASCl码中对应的是字符A


常量:指程序运行过程中值不改变的量

变量:指在程序运行过程中可以改变的量。变量可以通过变量名访问。


变量名:是一个标识符(identifier),用来指代一块内存区域,即变量,使用变量使我们操作内存以区域(area),以块(block)为单位,提高了方便性。

变量地址:系统要读取变量的值时,是要通过地址找到这个变量

存储单元:存储的关键是存储单元,每个存储单元对应一个变量地址,访问时通过变量地址访问,存储单元里面可以存储变量值,为了方便访问存储单元,可以用变量名代表变量地址

字符常量:是用单引号括起来的字符,占一个字节。如‘&’;转义字符是用来作为输出信息时的控制符号如‘\n’代表换行

字符变量:是用来存放字符常量的,它只能放一个字符;

字符串常量:是由若干个字符组合而成,用双引号括起来,存储时自动在后面加“\0”,即使同样是一个字符,字符串常量后面还要加一个“\0”。

字符常量与字符串常量有什么区别?

  字符常量和字符串常量的表示方法不同,字符常量是用单引号括起来的一个字符,字符串常量是用一对双引号括起来的0个或者多个字符组成的序列。

  最主要的区别是存储的不同:字符型数据在存储时,并不是把该字符本身放到内存单元中,而是把该字符的相应ASCII码值存放到该存储单元中;而字符串常量是将字符存储,并自动在其末尾加上‘\0’作为字符串结束的标志,所以字符串常量在内存中所占用的字节数为字符串长度+1。

符号常量的作用和使用方法?
符号常量是在C语言中,可以用一个标识符来表示一个常量,这个标识符称之为符号常量。符号常量用来简化编码时多次重复出现的特定数值,如Pl=3.1415926,我们可以用Pl替代。使用步骤:进行一次“顶编译”如#define Pl 3.1415926;然后进行正式的编译工作

简述基本运算符及其运算规则?
基本运算符有±*/%,运算规则是先乘除后加减,同级情况下自左向右,进行%运算要双目为整形。

简述++a与a++的区别?
++a是先进行自加运算,后进行其他运算,而a++这是先进行其他运算后进行自加,如a=1,b=a++,则b=1;b=++a,则b=2

第三章顺序程序设计

C语言为什么把输入输出的功能作为函数,而不作为语句的基本部分
不把输入输出作为C语句的目的是使C语言编译系统简单,因为将语句翻译成二进制的指令是在编译阶段完成的,把输入输出操作放在函数中处理,就可以使C语言本身的规模较小,编译程序简单,很容易在各种机器上实现,程序具有可移植性。

顺序结构:是最基本的一种结构,执行顺序是按照从上到下的顺序执行就行了

选择结构:当我们再执行下一个语句之前根据一个条件做出判断,选择下面的那一条语句或那一段语句,分支的概念也由此产生。

循环结构:当我们需要重复处理一点相同逻辑的代码时,就可以采用循环结构,这样可以大大减少代码量

怎样区分表达式和表达语句?C语言为什么要设表达式语句?什么时候用表达式?什么时候用表达语句?
表达式是操作符、操作数和标点符号组成的序列,其目的是用来说明计算过程。表达式语句则是在表达式后加分号,如i=1是表达式,i=1;则为表达语句。设表达语句的目的是规范代码语法格式,符合编译器的设置。我们在进行计算时会用到表达式进行运算,运算完成后需要表达式语句进行规范表达,程序中的计算功能主要由表达式语句来完成。

简述表示算法的几种方式
有自然语言表示算法、用流程图表示算法、用N-S流程图表示算法、用伪代码表示算法

C语言中的语句有几类?控制语句有哪些?
C语句可以分为以下五类:
(1)控制语句。完成一定的控制功能。
(2)函数调用语句;
(3)表达式语句;
(4)空语句;
(5)可以用{ }把一些语句括起来成为复合语句。
C只有9种控制语句,它们是:
(1)if()else(条件语句)
(2)for()~(转向语句)
(3)while()~(循环语句)
(4)do~while()(循环语句)
(5)continue(结束本次循环语句)
(6)break(中止执行switch或循环语句)
(7)switch(多分支选择语句)
(8)goto(转向语句)
(9)return(从函数返回语句)

使用if实现多支选择结构需要注意什么
内嵌if也应包括else部分;把内嵌的if放在外层的else子句中;加大括号,限定范围;程序写成锯齿形,同一层次的if和else在同一列上。

使用switch为什么需要用break?
在用switch 语句实现多分支选择结构时,“case常量表达式”只起语句标号作用,如果“switch”后面的表达式的值与“case”后面的常量表达式的值相等,就执行case后面的语句。但特别注意:执行完这些语句后不会自动结束,会继续执行下一个case子句中的语句。因此,应在每个case子句最后加一个break 语句,才能正确实现多分支选择结构。

第四章 选择结构程序设计


算术运算:是指加减乘除和整数的模运算(即取余数运算)。
关系运算:是比较运算,将两个数值进行比较,判断其比较结果是否符合给定的条件。
逻辑运算:两个条件进行运算,有逻辑与、逻辑或、逻辑非三种。

第五章 循环结构程序设计

为什么需要循环结构
循环结构可以帮助我们完成需要重复常量的问题

循环的分类
有两种循环:一种是无休止的循环,如地球围绕太阳旋转,永不终止;每一天24小时,周而复始。另一种是有终止的循环,达到一定条件循环就结束了,如统计完第50名学生成绩后就不再继续了。计算机程序只处理有条件的循环,算法的特性是有效性、确定性和有穷性,如果程序永远不结束,是不正常的。

简述C语言中常用的三种循环语句有
while、do…while和for

简述while循环和do…while循环的区别?
while是先进行判断,符合条件再进入循环体;do…while是先做一次循环体后再进行判断

提前结束循环的两种方法
用break提前结束整个循环,用continue提前结束本次循环

构建有效循环体的条件
需要重复执行的操作,记循环体;循环结束的条件

第六章 利用数组处理批量数据

数组:是有序数据的集合。数组中的每一个元素都属于同一个数据类型。用一个统一的数组名和下标来唯一地确定数组中的元素。使得具有同一属性的若干个数据组织成一个整体,它们再也不是互相孤立无关的单个数据,而是互相关联的,便于统一处理。

如何定义和引用数组
在定义数组时需要指定这批变量的类型、数组名称和数组中包含多少个元素(即变量),通过数组下表引用数组,如int a定义了一个一维数组长度为5,a则代表数组的第一个数值

C语言中字符串是如何存放的?什么时候代表结束?
字符串是以字符数组形式存放的,为了确定字符串的范围,C编译系统在每一个字符串的后面加一个作为字符串结束标志。0不是字符串的组成部分,输出字符串时不包括要区分字符数组和字符串,字符串可以放在字符数组中,如果宇符串的长度为n,则能存放该字符串的字符数组的长度应≥n+1

第七章 用函数实现模块化程序设计

模块化编程的好处?

把一个多功能的复杂的程序划分为若干个简单的功能单一的程序模块,有利于程序的优化和分工,提高程序的阅读性和可靠性。

变量的作用域是指变量有效的范围。根据定义变量的位置不同,变量分为局部量和全局变量。

局部变量:在函数内或复合语句中定义的变量都是,其作用域限制在函数内或复合语句内,函数或复合语句外不能引用该变量。

全局变量:在函数外定义的变量,其作用域为从定义点到本文件末尾,可以用extern对变量作“外部声明”,将作用域扩展到本文件中作extern声明的位置处,或在其他文件中用extern 声明将作用域扩展到其他文件。用static声明的静态全局变量禁止其他文件引用该变量,只限本文件内引用。

静态变量:生命周期是全局,作用域仍然有限,在哪个{ }大括号里定义的,只能在哪个大括号里使用,但是作用域范围不会被释放,直到程序结束后才会被释放;

局部变量和全局变量的区别?分别是怎么实现的?操作系统和编译器是怎么知道的?

区别:

  1>全局变量的生命周期是整个程序运行的时间,而局部变量的生命周期则是局部函数或过程调用的时间段。

  2>全局变量的作用域为“整个工程”,局部变量作用域则为从定义的位置开始,到定义它的右花括号结束,只在函数执行期间存在,函数的一次调用执行结束后,变量被撤销,其所占用的内存也被收回。

  3>全局变量存储在全局区,而局部变量存储在栈区。

  他们的实现是由编译器在编译时采用不同内存分配方法。

  全局变量在main函数调用后,就开始分配空间,(静态变量则是在main函数前就已经初始化了)。局部变量则是在用户栈中动态分配空间。

变量的生存期:是变量存在的时间。全局变量的生存期是程序运行的整个时间。局部变量的生存期是不相同的。用auto或register 声明的局部变量的生存期与所在的函数被调用的时间段相同,函数调用结束,变量就不存在了。用static声明的局部变量在函数调用结束后内存不释放,变量的生存期是程序运行的整个间。凡不声明为任何存储类别的都默认为auto(自动变量)

内部函数:一个函数只能被本文件中其他函数所调用。在定义内部函数时,在函数名和函数类型的前面加static,即 static 类型标识符 函数名(形参表);

外部函数:可供其他文件调用的函数。在定义外部函数时,在函数首部的最左端加关键字extern。

简述内部函数与外部函数的区别?
函数有内部函数与外部函数之分。函数本质上是外部的,可以供本文件或其他文件中的函数调用,但是在其他文件调用时要用extern 对函数进行声明。如果在定义函数时 用static 声明,表示其他文件不得调用此函数,即把它“屏蔽”起来。

函数:在C语言中,函数是用来完成某一个特定功能的。C程序是由一个或多个函数组成的。函数是C程序中的基本单位。执行程序就是执行主函数和由主函数调用其他函数。因此编写C程序,主要就是编写函数。

形参变量:只有在函数被调用时才会分配内存,调用结束后,立刻释放内存,所以形参变量只有在函数内部有效,不能在函数外部使用。

实参变量:可以是常量、变量、表达式、函数等,在进行函数调用时,它们都必须有确定的值, 以便把这些值传送给形参。函数调用过程是单向的,形参的改变不会影响到实参。

库函数:必须在本文件的开头用include指令把与该函数有关的头文件包含到本文件中来(如用数学函数时要加上include<math.h>)。

自己定义的函数:必须先定义,后调用。需要注意:如果函数的调用出现在函数定义位置之前,应该在调用函数之前用函数的原型对该函数进行引用声明。

函数的定义:是指对函数功能的确立,包括指定函数名、函数值类型、形参及其类型以及函数体等,它是一个完整的、独立的函数单位。

函数的声明:是把函数的名字、函数类型以及形参的类型、个数和顺序通知编译系统,以便在调用该函数时系统按此进行对照检查。

如何将数值作为函数的参数?
用数组元素作为函数实参,其用法与用普通变量作实参时相同,向形参传递的是数组元素的值用数组名作函数实参,向形参传递的是数组首元素的地址,而不是数组全部元素的值。如果形参也是数组名,则形参数组首元素与实参数组首元素具有同一地址,两个数组共占同一段内存空间。利用这一特性,可以在调用函数期间改变形参数组元素的值,从而改变实参数组元素的值。这是很有用的。要弄清其概念与用法。

第八章 指针

指针:指针就是地址,地址就是指针。地址就是内存单元的编号。指针变量就是存放内存地址的变量。凡是出现“指针”的地方,都可以用“地址”代替。在计算机科学中,指针(Pointer)是编程语言中的一个对象,利用地址,它的值直接指向(points to)存在电脑存储器中另一个地方的值。由于通过地址能找到所需的变量单元,可以说,地址指向该变量单元。因此,将地址形象化的称为”指针”。例如,变量的指针就是变量的地址,指针变量就是地址变量。

指针和数组的关系?

利用一个指针可以去操作一个数组,但是指针是一个可以变化的变量,可以实现自加自减的操作,但是数组是不可以这样操作的,数组一经定义就不能改变了,只能进行数组与数组之间长度相加。

指针变量:存放地址的变量。指针变量是一种特殊的变量,它不同于一般的变量,一般变量存放的是数据本身,而指针变量存放的是数据的地址。

指针运算:将该指针变量的原值(是一个地址)和它指向的变量所占用的内存单元字节数相加减,将一个变量地址赋给一个指针变量,指针间的比较等

举例说明指针和变量定义时的区别?
int i:定义整型变量i
intp:p为指向整型数据的指针变量
int a[n]:定义整型数组a,它有n个元素
intp[n]:定义指针数组p,它由n个指向整型数据的指针元素组成

在用数组名作为函数实参时,既然实际上相应的形参是指针变量,为什么还允许使用形参数组的形式呢?
这是因为在C语言中用下标法和指针法都可以访问一个数组(如果有一个数组a,则a和*(a+i)是无条件等价的),用下标法表示比较直观,便于理解。因此许多人愿意用数组名作形参,以便与实参数组对应。从应用的角度看,用户可以认为有一个形参数组,它从实参数组那里得到起始地址,因此形参数组与实参数组共占同一段内存单元,在调用函数期间,如果改变了形参数组的值,也就是改变了实参数组的值。当然在主调函数中可以利用这些已改变的值。对C语言比较熟练的专业人员往往喜欢用指针变量作形参。

第九章 使用结构体类型处理组合数据

结构体:C语言允许用户自己建立由不同类型数据组成的组合型的数据结构。是一个可以包含不同数据类型的一个结构,它是一种可以自己定义的数据类型。特点:1、结构体可以在一个结构体中声明不同的数据类型; 2、相同的结构的结构体变量可以相互赋值; 3、节省内存空间。 4、高效率。

结构化程序设计(structured programming,简称SP)是进行以模块功能和处理过程设计为主的详细设计的基本原则。其概念最早由E.W.Dijikstra在1965年提出的。结构化程序设计思想确实使程序执行效率提高 ,是软件发展的一个重要的里程碑,它的主要观点是采用自顶向下、逐步求精的程序设计方法;各个模块通过“顺序、选择、循环”的控制结构进行连接,并且只有一个入口、一个出口 。

结构体变量的指针:是结构体变量的起始地址,注意它的基类型是结构体类型的数据。可以定义指向结构体变量的指针变量,这个指针变量的值是结构体变量的起始地址。指向结构体变量的指针变量常用于作为函数参数和链表中(用来指向下一个结点)。

结构体和结构体指针能组建什么?
把结构体变量和指向结构体变量的指针结合起来,可以建立动态数据结构(如链表)。开辟动态内存空间用malloc函数,函数的返回值是所开辟的空间的起始地址。利用所开辟的空间作为链表的一个结点,这个结点是一个结构体变量,其成员由两部分组成:一部分是实际的有用数据,另一部分是一个指向结构体类数据的指针变量,利用它指向下一个结点。

结构体和共用体的区别?

共用体与结构体不同,其各成员不是分别占独立的存储单元,而是共享同一段存储空间,因此,各成员的值不会同时存在,在某一瞬时,只有最后一次被赋值的成员是有意义的。(注意区别两者内存的大小,结构体的内存大小是结构体各个元素和,不考虑内存对齐。共用体是元素里面最大的那个大小)

枚举类型:是把可能的值全部一一列出,枚举变量的值只能是其中之一。实际生活中有些问题没有现成的数学公式来解决,只能把所有的可能性一一列出,测试其是否满足条件,这时用枚举变量比较方便。

第十章 利用文件保存数据

C语言采用“缓冲文件系统”处理文件

缓冲文件系统:系统自动地在内存区为程序中每一个正在使用的文件开辟一个文件缓冲区。

C语言采用什么系统读写文件?
C语言采用缓冲文件系统,为每一个使用的文件在内存开辟一个文件缓冲区,在计算机输入时,先从文件把数据读到文件缓冲区,然后从缓冲区分别送到各变量的存储单元。在输出时,先从内存数据区将数据送到文件缓冲区,待放满缓冲区后一次输出,这有利于提高效率。

文件指针:缓冲文件系统中,关键的概念是“文件类型指针”,简称“文件指针”。每个被使用的文件都在内存中开辟一个相应的文件信息区,用来存放文件的有关信息(如文件的名字、文件状态及文件当前位置等)。这些信息是保存在一个结构体变量中的。该结构体类型是由系统声明的,取名为FILE。通过文件指针访问文件的好处是:可以随机访问文件,有效表示数据结构,动态分配内存,方便使用字符串,有效使用数组。

文件使用前必须“打开”,用完后应当“关闭”。

1,打开:是建立相应的文件信息区,开辟文件缓冲区。由于建立的文件信息区没有名字,只能通过指针变量来引用,因此一般在打开文件时同时使指针变量指向该文件的信息区,以便程序对文件进行操作。

2.关闭:是撤销文件信息区和文件缓冲区,指针变量不再指向该文件。使用完如果不关闭文件可能会丢失数据。

文件:是在存储在外部介质上数据的集合,操作系统把所有输入输出设备都作为文件来管理。每一个文件需要有一个文件标识,包括文件路径、文件主干名和文件后缀。

分类:根据文件的组织形式,文件可以分为ASCII文件和二进制文件。

栈:由编译器自动分配释放,存放函数参数值,局部变量的值等。栈内存存储的是局部变量而堆内存存储的是实体;栈内存的更新速度要快于堆内存,因为局部变量的生命周期很短;栈内存存放的变量生命周期一旦结束就会被释放,

堆:一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。堆内存存放的实体会被垃圾 回收机制不定时的回收。

C语言程序中主要用到两种文件:
(1) 程序文件。包括源程序文件、目标文件、可执行文件等。这种文件是用来存放程序的,以便实现程序的功能。
(2) 数据文件。文件的内容不是程序,而是供程序运行时读写的数据,如在程序运行过程中输出到磁盘的数据,或者供程序运行时读入内存的数据。

文件名:一个文件要有一个唯一的文件标识,以便用户识别和引用。文件名主干的命名规则遵循标识符的命名规则。后缀用来表示文件的性质,一般不超过3个字母。文件标识包括三部分:(1)文件路径:(2)文件名主干;(3)文件后缀。

数据文件:有两类,分别为ASCIl文件和二进制文件。ASCII文件又称文本文件,它的每一字节放一个字符的ASCII代码。二进制文件是把内存中的数据按其在内存中的存储形式原样输出到磁盘上存放。字符型数据只能以ASCII形式存储,数值型数据可以用ASCII形式存储到磁盘上,也可以用二进制形式存储。

文件指针:文件指针是缓冲文件系统中的一个重要的概念。用来存放文件有关信息。文件指针是指向FILE类型数据的,具体来说就是指向某一文件信息区的开头。通过这个指针可以得到文件的有关信息,从而对文件进行操作。这就是指针指向文件的含义。

文件信息区:在文件打开时,在内存建立一个文件信息区,用来存放文件有关信息。这个信息区的数据组织成结构体类型,系统把它命名为FILE类型。

文件指针是缓冲文件系统中的一个重要的概念。在文件打开时,在内存建立一个文件信息区,用来存放文件有关信息。这个信息区的数据组织成结构体类型,系统把它命名为FILE类型。文件指针是指向FILE类型数据的,具体来说就是指向某一文件信息区的开头。通过这个指针可以得到文件的有关信息,从而对文件进行操作。这就是指针指向文件的含义。

文件读写的方式有哪些?
有两种对文件的读写方式,顺序读写和随机读写。对于顺序读写而言,对文件读写数据的顺序和数据在文件中的物理顺序是一致的。对于随机读写而言,对文件读写数据的顺序和数据在文件中的物理顺序一般是不一致的。可以在任何位置写入数据,任何位置读取数据。

简答

关键字const有什么作用?

定义const常量,只具有可读性,防止被修改,增加程序健壮性,便于类型检查,节省时间提高效率。

关键字volatile有什么含义,试举例?

一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。下面是volatile变量的几个例子:
1). 并行设备的硬件寄存器(如:状态寄存器)
2). 一个中断服务子程序中会访问到的非自动变量(Non-automatic variables)
3). 多线程应用中被几个任务共享的变量

为什么使用符号常量?

1)简化书写格式、减少出错率。

2)定义符号常量可以提高程序的可读性,便于程序的调试和修改。

3)符号常量不同于变量,在其作用域内不能被改变和重新赋值。

4)习惯上人们把符号常量名用大写字母表示,变量用小写,以示区别。

Void关键字的用途?

 void是空类型, void的作用在于:

 (1)对函数返回的限定。(2) 对函数参数的限定。

C语言以函数为程序的基本单位,有什么好处?

函数是程序的基本组成单位,利用函数不仅可以使程序模块化,而且可以使程序设计的简单和直观,提高程序的可读性和可维护性。

局部变量和全局变量能否重名?

能,局部会屏蔽全局。要用全局变量,需要使用"::"。

如何引用一个已经定义过的全局变量?

可以用引用头文件的方式,也可以用extern关键字。如果用引用头文件方式来引用某个在头文件中声明的全局变量,假定你将那个变量写错了,那么在编译期间会报错,如果你用extern方式引用时,假定你犯了同样的错误,那么在编译期间不会报错,而在连接期间报错。

全局变量可不可以定义在被多个.c文件包含的头文件中?为什么?

可以,在不同的C文件中以static形式来声明同名全局变量,前提是其中只能有一个C文件中对此变量赋初值,此时连接不会出错。

描述一下strcmp(a,b)函数?

比较函数。a>b返回正数,a=b返回0,a<b返回负数。

关键字和一般标识符有什么区别?

标识符用来标识源程序中的某个对象的名字,一个标识符由字母、数字和下划线组成。关键字可以定义变量、表达式语句功能和对一些文件进行预处理,关键字已被编译系统本身使用,所以用户编写程序时不能够使用这些关键字来作为标识符,如int,if,for

谈谈对左移操作符和右移操作符的理解?

左移操作符:二进制位左移,右端补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.指针函数和函数指针的区别?

指针函数:是一个函数,返回值是一个指针,要注意返回的这个指针不能是局部变量。

函数指针:是一个指针,是一个指向函数的指针,是调用函数的入口。

什么是野指针?成因?

野指针通俗的讲就是格式不规范,有问题的指针。按书上的说就是指针指向的位置是不可知的

成因:

  1>指针未初始化;

  2>指针越界访问;

  3>指针指向的空间释放;

如何规避野指针?

1>指针初始化;

2>小心指针越界;

3>避免指针指向的空间为已释放的空间;

4>指针使用之前检查有效性;

数组越界后果?

越界访问有可能把数据放到已经存储了重要数据的内存单元,也就是改写了本来不许改写的数据。有可能导致系统运行紊乱甚⾄是崩溃。避免的办法是对数组的下标严格检测,判断数组下标是否越界。

引用与指针的区别?

引用必须被初始化,引用初始化以后不能被改变,指针不要求必须初始化。指针可以改变所指的对象,不存在指向空值的引用,但是存在指向空值的指针。

值传递和地址传递的区别?

值传递只是把变量的值当做参数传递进子函数中,无论函数体中如何改变参数值,主函数的变量值都不会改变。

而地址传递,是把变量的地址传入子函数中,子函数中对于参数的改变,是通过传入的地址参数去内存中修改该变量存储的值,所以主函数中的变量值也会同步改变。

字符指针、浮点数指针以及函数指针这三种类型的变量哪个占用的内存最大?为什么?

一样大。指针变量只需要存储一段内存单元的首地址。指针变量的大小由机器位数决定,无论是哪种数据类型,都是用32/64位表示,所以占用内存一样大。

内存分配的三种方式?

  1>从静态存储区域分配。例如全局变量,static变量。

  2>在栈上创建。

  3>从堆上分配,亦称动态内存分配。

类与结构体有什么区别?

  1>结构体存储在栈中,类的实例化可以存储在栈中,也可以存储在堆中;

  2>结构体的执行效率比类要高;

  3>结构体没有析构函数,类有析构函数;

  4>结构体不可以继承,类可以继承。

堆栈溢出一般是由什么原因导致的?

  1>没有回收垃圾资源。

  2>层次太深的递归调用

怎样区分表达式和表达式语句?为什么有人称C为表达式语言?

表达式不是独立存在的,它存在于其它表达式、语句、函数参数里,表达式后面加上一个分号,就变成表达式语句。

由于C程序中大多数语句是表达式语句(包括函数调用语句),所以有人把C语言称作“表达式语言”。

算法有哪些描述方法?各有什么优缺点?

(1)自然语言(2)伪代码(3)流程图(4)计算机语言

优缺点:

自然语言通俗易懂,但有歧义性;

伪代码方便实用,但没有流程图明晰,容易犯逻辑错误;

流程图明晰但绘制和修改时比较繁琐;

计算机语言表示算法严谨,但无法做到算法设计的第一步就使用计算机语言,读程序比看流程图要费神很多。

举例说明文本文件和二进制文件的适用场合。

1>能存储的数据类型不同:

  文本文件只能存储char型字符变量。

  二进制文件可以存储char/int/short/long/float/…各种变量值。

2>每条数据的长度:

  文本文件每条数据通常是固定长度的。

  二进制文件每条数据不固定。

3>读取的软件不同:

  文本文件编辑器就可以读写。

  二进制文件需要特别的解码器。

C语言中如何表示“真”和“假”?系统如何判断一个量的“真”和“假”?
在C语言中逻辑常量只有两个,即0和1,用来表示两个对立的逻辑状态,其中0表示假,1表示真。

逻辑变量与普通代数一样,也可以用字母、符号、数字及其组合成为的逻辑表达式表示。

对于系统来说,判断一个逻辑量的值时,系统会以0作为假,以非0作为真。例如3&&5的值为真,系统给出3&&5的值为1。

引用

【精选】数据结构和c语言的名词解析_c语言解释名词:数据_木y的博客-CSDN博客

考研复试C语言(谭浩强5版)-CSDN博客


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值