c语言简答

C程序的特点

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

上机运行C程序的方法步骤

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

计算机由什么控制?为什么需要高级编程语言?

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

机器语言和汇编语言与高级编程语言的区别?

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

可以进行预编译情况:

1>总是使用不经常改动的大型代码体。2>程序由多个模块组成,所有模块都使用一组标准的包含文件和相同的编译选项。

编辑好源代码后为什么还要进行编译才能执行?

由于C语言是高级编程语言,而计算机的底层是二进制的机器语言,且不同的设备之间的二进制语言不互通,因此我们需要通过编译将程序转化为机器语言,也可以通过不同的编译系统,适应不同的机器。

C语言数据类型有哪几类?基本数据类型包括哪几类?

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

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

字符常量和字符串常量的表示方法不同,字符常量是用单引号括起来的一个字符,字符串常量是用一对双引号括起来的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流程图表示算法、用伪代码表示算法

使用if实现多支选择结构需要注意什么

内嵌if也应包括else部分;把内嵌的if放在外层的else子句中;加大括号,限定范围;程序写成锯齿形,同一层次的if和else在同一列上。

使用switch为什么需要用break?

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

如何定义和引用数组

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

C语言中字符串是如何存放的?什么时候代表结束?

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

模块化编程的好处?

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

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

区别:1>全局变量的生命周期是整个程序运行的时间,而局部变量的生命周期则是局部函数或过程调用的时间段。2>全局变量的作用域为“整个工程”,局部变量作用域则为从定义的位置开始,到定义它的右花括号结束,只在函数执行期间存在,函数的一次调用执行结束后,变量被撤销,其所占用的内存也被收回。3>全局变量存储在全局区,而局部变量存储在栈区。

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

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

简述内部函数与外部函数的区别?

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

如何将数值作为函数的参数?

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

指针和数组的关系?

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

举例说明指针和变量定义时的区别?

int i:定义整型变量i
intp:p为指向整型数据的指针变量
int a[n]:定义整型数组a,它有n个元素
intp[n]:定义指针数组p,它由n个指向整型数据的指针元素组成

在用数组名作为函数实参时,既然实际上相应的形参是指针变量,为什么还允许使用形参数组的形式呢?

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

结构体和结构体指针能组建什么?

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

结构体和共用体的区别?

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

C语言采用什么系统读写文件?

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

C语言程序中主要用到两种文件:

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

文件读写的方式有哪些?

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

关键字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;

goto语句怎么使用?

goto语句可以跳转到函数中任何有标号的语句处。

语法结构:执行语句goto 标识符Q;

控制会转移到标号Q后面的语句中,而且要注意的是该语句必须和goto语句在同一个函数中。

简述default子句?

当switch表达式的值并不匹配所有的case标签的值时,这个default子句后面的语句就会执行。所以,每个switch语句中只能出现一条default子句。但是它可以出现在语句列表的任何位置,而且语句流会像贯穿一个case标签一样贯穿default子句。

Const与#define相比,有什么优点?

Const作用:定义常量、修饰函数参数、修饰函数返回值三个作用。被Const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。

1) const 常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查。而对后者只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不到的错误。

2) 有些集成化的调试工具可以对const常量进行调试,但是不能对宏常量进行调试

逻辑与与按位与有什么区别?逻辑或与按位或有什么区别?

按位与&和按位或|对操作数进行求值运算,逻辑与&&和逻辑或||只是判断逻辑关系。 逻辑与&&和逻辑或||在判断左侧操作数确定结果的情况下就不再对右侧操作数求值。

请简述C语言的隐式类型转换发生的四种情况,并说明每种情况如何转换?

1>算术运算式中,低类型能转换为高类型。

2>赋值表达式中,右边表达式的值自动隐式转换为左边变量的类型,并赋值给它。

3>函数调用中参数传递时,系统隐式地将实参转换为形参的类型后,赋给形参。

4>函数有返回值的时候,系统隐式的将返回表达式类型转换为返回值类型,赋给调用函数。

Sizeof和strlen有什么区别?

strlen 是一个函数,它用来计算指定字符串的长度,但不包括结束字符。

关键字 sizeof 是一个单目运算符,而不是一个函数。与函数 strlen 不同,它的参数可以是数组、 指针、类型、对象、函数等,他所求的为所占内存空间,而不是实际长度。

关键字typedef和#define有什么区别?

1>用法不同:typedef 用来定义一种数据类型的别名,增强程序的可读性。define 主要用来定义常量,以及书写复杂使用频繁的宏量。

2>执行时间不同:typedef 是编译过程的一部分,有类型检查的功能。define 是宏定义,是预编译的部分,其发生在编译之前,只是简单的进行字符串的替换,不进行类型的检查。

3>作用域不同:typedef 有作用域限定。define 不受作用域约束,只要是在 define 声明后的引用都是正确的。

4>对指针的操作不同:typedef 和 define 定义的指针时有很大的区别。

5>typedef 定义是语句,因为句尾要加上分号。而 define 不是语句,千万不能在句尾加分号。

关键子static有什么作用?

第一:修饰局部变量,static修饰局部变量改变了变量的生命周期让静态局部变量出了作用域依然存在,到程序结束,生命周期才结束。本质上改变了变量的存储类型,将存储在栈区的局部变量转移到静态区。

第二:修饰全局变量,一个全局变量被static修饰,使得这个全局变量只能在本源文件内使用,不能在其他源文件内使用。因为全局变量具有外部链接属性,但被static修饰以后,就变成了内部链接属性。

第三:修饰函数,一个函数被static修饰,使得这个函数只能在本源文件内使用,不能在其他源文件内使用。因为函数具有外部链接属性,但被static修饰以后,就变成了内部链接属性。

函数的嵌套调用和递归调用有什么区别?

函数嵌套允许在一个函数中调用另外一个函数,递归调用是调用本身的函数。函数嵌套就是函数调用函数,是普遍的,递归就是函数调用自身,是函数嵌套的一个特例

传值调用和传址调用的区别?

传值调用将实参的数据(而不是地址)传给了形参,在被调用的函数中,形参值改变了,但是不影响主调函数的实参值。数值传递方向是由实参向形参单向传递。

传址调用与传值调用不同,传址调用是将实参变量的地址传给形参,改变形参的同时也把实参改变了。

指针数组和数组指针的区别?

指针数组可以说成是”指针的数组”,首先这个变量是一个数组,其次,”指针”修饰这个数组,意思是说这个数组的所有元素都是指针类型。

数组指针可以说成是”数组的指针”,首先这个变量是一个指针,其次,”数组”修饰这个指针,意思是这个指针指向一个数组的首地址。

指针函数和函数指针的区别?

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

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

什么是野指针?成因?

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

成因:

  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。

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值