1.C语言特点
(1)语言简洁、紧凑,使用方便、灵活。
(2)运算符丰富。
(3)数据类型丰富,具有现代语言的各种数据结构。
(4)具有结构化的控制语句,是完全模块化和结构化的语言。
(5)语法限制不太严格,程序设计自由度大。
(6)允许直接访问物理地址,能进行位操作,能实现汇编语言的大部分功能,可直接对硬件进行操作。
(7)目标代码质量高,程序执行效率高。
(8)程序可移植性好。
2.学习c语言的经验
不要把学习语言当成很痛苦的过程,事实上学习c语言很有趣,很上瘾,
在学习的过程中要多敲代码,很多知识点,通过敲代码,可以有更深刻的理解和领悟,很多问题也只有在敲代码的时候才能发现;
有时程序本身没有语法错误,也能够顺利运行,但是运行结果不对,这就是代码的逻辑上有问题,要靠自己的上机经验分析判断错误所在:
多浏览网络上的开源社区,多看别人的代码,汲取经验;
在编程的过程中,一定要多保存文件。
3.一个优秀的程序员应该具备什么素质
有清晰的思维逻辑;
有学习和总结的能力;
有团队协作能力和沟通能力;
有规范化,标准化的代码编写习惯,对代码有测试习惯
4.你是如何理解好的编程的
代码界面要干净整洁;
交量的命名要规范,做到见名知意;
对关键部分多使用注释说明;
程序结构化,模块化,做到内聚性强,耦合性弱。
5.运行c的步骤(✔)
1.上机输入和编辑源程序,检查无误后,将源程序以文件的形式存放在文件夹中,后缀为.C
2.编译系统对源程序进行编译,将源程序转换为二进制形式的,以.obj 为后缀的目标程序
3.进行连接处理,将所有目标模块输入计算机,与库函数连接,生成一个可供计算机执行的,后缀为.exe 的目标程序;
4.运行可执行程序,得到运行结果。
6.什么是程序?什么是程序设计? 程序设计的过程
(1)程序:就是一组能识别和执行的指令,每一条指令使计算机执行特定的操作;
(2)程序设计:是指从确定任务到得到结果、写出文档的全过程;
(3)程序设计过程:
1.分析问题;
2.设计算法;
3.编写程序;
4.对源程序进行编辑,编译和连接;
5,运行程序,分析结果。
7.为什么需要计算机语言?高级语言有哪些特点?
(1)为什么需要计算机语言:
计算机语言解决了人和计算机交流是的语言问题,使得计算机和人都能识别
(2)高级语言有哪些特点:
2.1 高级语言的数据结构要比汇编和机器语言丰富;
2.2 高级语言与具体机器结构的关联没有汇编以及机器语言密切;
2.3 高级语言更接近自然语言更容易掌握;
2.4 高级语言编写的程序要经过编译或解释计算机才能执行;
8.正确理解以下名词及其含义:
(1)源程序,目标程序,可执行程序
源程序:指未编译的按照一定的程序设计语言规范书写的文本文件,是一系列人类可读的计算机语言指令
目标程序:为源程序经编译可直接被计算机运行的机器码集合,在计算机文件上以.obj作扩展名
可执行程序:将所有编译后得到的目标模块连接装配起来,在与函数库相连接成为一个整体,生成一个可供计算机执行的目标程序,成为可执行程序
(2)程序编辑,程序编译,程序连接。
程序编辑:上机输入或者编辑源程序。
程序编译:
先用C提供的“预处理器”,对程序中的预处理指令进行编译预处理
对源程序进行语法检查, 判断是否有语法错误,直到没有语法错误未知
编译程序自动把源程序转换为二进制形式的目标程序
程序连接:将所有编译后得到的目标模块连接装配起来,在与函数库相连接成为一个整体的过程称之为程序连接
(3)程序,程序模块,程序文件。
程序:一组计算机能识别和执行的指令。
程序模块:可由汇编程序、编译程序、装入程序或翻译程序作为一个整体来处理的一级独立的、可识别的程序指令
程序文件:程序的文件称为程序文件,程序文件存储的是程序,包括源程序和可执行程序
(4)函数,主函数,被调用函数,库函数。
函数:将一段经常需要使用的代码封装起来,在需要使用时可以直接调用,来完成一定功能
主函数:又称main函数,是程序执行的起点
被调用函数:由一个函数调用另一个函数,则称第二个函数为被调用函数
库函数:一般是指编译器提供的可在c源程序中调用的函数。可分为两类,一类是c语言标准规定的库函数,一类是编译器特定的库函数
(5)程序调试,程序测试。
程序调试:是将编制的程序投入实际运行前,用手工或编译程序等方法进行测试,修正语法错误和逻辑错误的过程
程序测试:是指对一个完成了全部或部分功能、模块的计算机程序在正式使用前的检测,以确保该程序能按预定的方式正确地运行
9.什么是算法?试从日常生活中找3个例子,描述它们的算法?算法的特征?表示算法的常用方法?
(1)算法
对特定问题求解步骤的一种描述。
(2)例子:
1. 考大学:首先填报志愿表、交报名费、拿到准考证、按时参加考试、收到录取通知书、按照日期到指定学校报到。
2. 去北京听演唱会:首先在网上购票、然后按时坐车到北京,坐车到演唱会会场。
3. 把大象放进冰箱:先打开冰箱门,然后将大象放进冰箱,关冰箱。
(3)算法的特征?
有穷性、确定性、可行性、有零个或多个输入、有一个或多个输出
(4)表示算法的常用方法?
自然语言、流程图、伪代码、计算机语言
10.什么叫结构化的算法?为什么要提倡结构化的算法?试述算法3种基本结构的特点(✔)
(1)结构化算法:由一些顺序、选择、循环等基本结构按照顺序组成,流程的转移只存在于一个基本的范围之内。
(2)为什么要提倡结构化的算法?
结构化算法便于编写,可读性高,修改和维护起来简单,可以减少程序出错的机会,提高了程序的可靠性,保证了程序的质量,因此提倡结构化的算法。
(3)结构化程序设计方法主要由以下三种基本结构组成:
1. 顺序结构:顺序结构是一种线性、有序的结构,它依次执行各语句模块
2. 选择结构:选择结构是根据条件成立与否选择程序执行的通路。
3. 循环结构:循环结构是重复执行一个或几个模块,直到满足某一条件
11.什么叫结构化程序设计?它的主要内容是什么?
(1)结构化程序设计(structured programming,简称SP)是进行以模块功能和处理过程设计为主的详细设计的基本原则。是过程式程序设计的一个子集,它对写入的程序使用逻辑结构,使得理解和修改更有效更容易。
(2)主要内容:把一个复杂问题的求解过程分段进行,每个阶段处理的问题都控制在人们容易理解和处理的范围内。
12.变量,常量,常变量,标识符介绍?(✔)
(1)变量是在程序运行期间,变量的值是可以改变的
(2)常量是在程序运行过程中,其值不能被改变的量
(3)常变量:const就是用来限定一个变量不允许被改变的
(4)标识符:给对象起一个名字。C语言规定标识符只能由字母、数字和下划线3种字符组成,且第一个字符必须为字母或下划线,C中的关键字不能作为变量名,同一字母的大小写被认为是两个不同的字符
变量必须是先定义,后使用
目的:是指定一个变量的类型不仅决定了该变量存储在内存中所占的空间(字节数)大小,而且也规定了该变量的合法操作,以及检测使用该变量的正确性。
13.C 语言的数据类型有四大类(✔)
基本类型(整型、字符型、浮点型)
构造类型(数组类型、结构类型 struct、联合类型 union、枚举类型enum)
指针类型
空类型
14.什么是算术运算?什么是关系运算?什么是逻辑运算?(✔)
(1)算术运算:即“四则运算”,是加法、减法、乘法、除法、乘方、开方等几种运算的统称。
(2)关系预算:关系运算通常被认为是比较运算,将两个数值进行比较,判断比较结果是否符合给定的条件。
(3)逻辑运算:又称布尔运算,在逻辑代数中,有与、或、非三种基本逻辑运算。而在C语言中,逻辑运算通常用于使用逻辑运算符将关系表达式或其它逻辑量连接起来组成逻辑表达式用来测试真假值。
15.C语言中如何表示“真”和“假”?系统如何判断一个量的“真”和“假”?(✔)
(1)在C语言中逻辑常量只有两个,即0和1,用来表示两个对立的逻辑状态,其中 0 表示假, 1 表示真。
(2)对于系统来说,判断一个逻辑量的值时,系统会以 0 作为假,以 非0 作为真。
16.写出你在程序设计中所用到过的运算符 (至少5种)(✔)
(1)算术运算符(+ -*/% ++ --)
(2)关系运算符(>,<,==,>=,<=,! =)
(3)逻辑运算符(!,&&,||)
(4)位运算符(<<,>>,~,|,∧,&)
(5)赋值运算符(=及其扩展赋值运算符)
(6)条件运算符(?:)
(7)逗号运算符(,)
(8)指针运算符(* 和 &)
(9)求字节数运算符(sizeof)
(10)强制类型转换运算符((类型))
(11)分量运算符(.->)
(12)下标运算符([ ])
(13)其他 (如函数调用运算符())
17.列举常用运算符优先级(✔)
逻辑非运算符>自增,自减运算符>算数运算符>关系运算符>逻辑与,逻辑或运算符>条件运算符>赋值运算符>逗号运算符:(条赋逗)
18.continue语句和 break语句的区别(✔)
continue语句只结束本次循环,即跳过循环体中下面尚未执行的语句,而不是终止整个循环的执行
break语句则是结束整个循环过程,不再判断执行循环的条件是否成立
19.简述一下c语言中循环语句的语法和用法
(1)while(表达式)语句
当表达式为非 0值时,执行 while语句中的内嵌语句,再继续判断表达式的值,直到表达式的值为假时,退出循环。
(2)do
循环体语句
while(表达式);
先执行一次指定的循环体语句,然后判别表达式,当表达式的值为非零(“真”)时,返回重新执行循环体语句,如此反复,直到表达式的值等于 0为止,此时循环结束。
- for(表达式 1;表达式 2;表达式 3)
语句
1、先求解表达式1。
2、求解表达式 2,若其值为真(值为非 0),则执行 for语句中指定的内嵌语句,然后执行下面第3步。若为假(值为 0),则结束循环,转到第5步。
3、求解表达式 3。
4、转回上面第2步骤继续执行。
5、循环结束,执行for语句下面的一个语句
20.while语句和用do-while语句的比较
在一般情况下,用 while语句和用 do-while语句处理同一问题时,若二者的循环体部分是一样的,它们的结果也一样。
但是如果 while后面的表达式一开始就为假(0值)时,两种循环的结果是不同的
21.sizeof 和strlen 的区别
(1)sizeof是一个操作符,strlen是库函数。
(2)sizeof的参数可以是数据的类型,也可以是变量,而strlen只能以结尾为‘\0’的字符串作参数。
(3)编译器在编译时就计算出了sizeof的结果,而strlen函数必须在运行时才能计算出来。并且sizeof计算的是数据类型占内存的大小,而strlen计算的是字符串实际的长度。
数组做sizeof的参数不退化,传递给strlen就退化为指针了
22.变量的声明和定义有什么区别
(1)变量的定义为变量分配地址和存储空间, 变量的声明不分配地址。
(2)一个变量可以在多个地方声明, 但是只在一个地方定义。
(3)加入extern 修饰的是变量的声明,说明此变量将在文件以外或在文件后面部分定义。
23.函数的划分,定义及作用?
(1)函数的划分:按照用户使用角度划分(库函数,自定义函数);按照函数形式的划分(无参函数,有参函数)
(2)函数的定义:C语言要求,在程序中用到的所有函数,必须“先定义,后使用”。在定义时指定函数名字,类型,返回值类型,参数的名字和类型,函数的功能;对于C编译系统提供的库函数,只需用#include指令把有关的头文件包含到本文件模块中即可。
(3)函数的作用:函数是指功能。每一个函数用来实现一个特定的功能,函数的名字反映其代表的功能。
24.什么是形参?什么是实参?
形参是函数被调用时用于接收实参值的变量;
实参是在调用函数时传递给函数的参数。
25.递归调用和嵌套调用
C程序中,函数的定义都是互相平行和独立的,即函数内不能嵌套定义函数,而在 C语言中,允许函数的嵌套调用,即在一次函数调用过程中又调用了另一个函数。
在调用一个函数的过程中,间接或直接调用该函数本身,便构成函数的递归调用。设计递归程序的关键在于对问题的递归定义,这是此类问题的难点。在任何问题的递归定义中,都必然包含两点,即递归方式和递归终止的条件。
- 嵌套调用与递归调用有什么区别
(1)作用不同:
函数嵌套允许在一个函数中调用另外一个函数,比如有三个函数
例: funca(){ funcb();}
funcb(){ funcc();}
funcc(){ cout <<"Hello"<<endl;}这个就叫做嵌套调用,
它是一个语言提供的程序设计的方法,也就是语言的特性
递归调用是一种解决方案,在程序中,递归函数的限制条件就是变量 quotient为零。在每次递归调用之前,我们都把quotient除以10,所以每选归调用一次它的值就越来越接近零。当它最终变成零时,递归便告终业。
(2)含义不同:
嵌套调用,就是函数里面调用函数,调用的是谁没关系,都属于嵌套。
递归调用,就是函数调用本身。
(3)调用方式不同:
嵌套调用说的是调用其它函数。
递归调用是指自己调用自己。
26.内部函数和外部函数
(1)内部函数:一个函数只能被本文件中其他函数所调用,在定义内部函数时,在函数名和函数类型的前面加 static。
(2)外部函数:在定义函数时,如果在函数首部的最左端加关键字 extern,则表示此函数是外部函数,可供其他文件调用如果在定义函数时省略 extern,则隐含为外部函数。
27.语言中参数传递有哪几种,各有什么特点
参数传递有“传值方式'和“传地址方式'两种:
(1)传值方式:单向的将实参数据传递给形参,在被调用函数运行完毕后,不将形参的结果回传给实参;由于数据在传递方和被传递方占用不同的内存空间。所以变量在被调用时无论如何变化,都不会影响调用的函数中相应的实参。
(2)传地址方式:传递的是地址值,将数据的存储地址作为实参,形参必须是可以接受该地址值的指针变量,它的数据类型必须与被传送数据的数据类型相同。因为数据在传递方和被传递方占用相同的内存空间,所以在被调用函数中,对该存储地址空间的值做出变动后,会影响到该空间的调用的函数中的变量的值。
补充:
C语言调用函数时虚实结合的方法都是采用“值传递”方式
当用变量名作为函数参数时传递的是变量的值。当用数组名作为函数参数时,由于数组名代表的是数组首元素地址,因此传递的值是地址,所以要求形参为指针变量.
归纳起来,如果有一个实参数组,想在函数中改变此数组中的元素的值,实参与形参的对应关系有以下 4种情况:(1)形参和实参都用数组名。(2)实参用数组名,形参用指针变量。(3)实参形参都用指针变量。(4)实参为指针变量,形参为数组名。
28.全局变量和局部变量区别
(1)在函数内定义的变量是局部交量,在函数外定义的变量是全局变量;
(2)局部变量的作用域是定义该变量的函数或者复合语句,在其他范围内无效。全局变量的作用域是从该变量定义的位置开始,直到整个源文件结束;
(3)若全局变量与某个函数中的局部变量同名,则在该函数内,这个全局变量被屏蔽,访问的是局部变量,与同名的全局变量不发生任何关系。
29.局部变量的存储类别
auto变量
static变量
register 变量
30.存储类别划分
(1)从作用域角度分,有局部变量和全局变量
(2)从变量存在的时间(生存期)来区分,有动态存储和静态存储两种类型
(3)从变量值存放的位置来区分,可分为:内存中静态存储区,内存中动态存储区,cpu中的寄存器
31.static关键字的作用是什么?
(1)函数中的局部变量的值在函数调用结束后不消失而保留原值,即其占用的存储单元不释放,在下一次该函数调用时,该变量已有值,就是上一次函数调用结束时的值。
(2)用 static声明外部变量,该变量只限于被本文件引用,而不能被其他文件引用
(3)static函数与普通函数有什么区别:static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝。
32.带参数的宏和函数的区别
(1)函数调用时,先求出实参表达式的值,然后代入形参。而使用带参的宏只是进行简单的字符替换。
(2)函数调用是在程序运行时处理的,为形参分配临时的内存单元。而宏展开则是在编译前进行的,在展开时并不分配内存单元,不进行值的传递处理,也没有“返回值”的概念。
(3)对函数中的实参和形参类型要求一致。而宏名无类型,它的参数也无类型,只是一个符号代表,展开时代入指定的字符串即可。
(4)调用函数只可得到一个返回值,而用宏可以设法得到几个结果。
(5)使用宏次数多时,宏展开后源程序长,因为每展开一次都使程序增长,而函数调用不会使源程序变长。
(6)宏替换不占运行时间,只占编译时间。而函数调用则占运行时间(分配单元、保留现场、值传递、返回)。
33.简述数组和指针的关系
数组和指针都可以处理内存中连续存放的一系列数据,数组与指针在访问内存时采用统一的地址计算方法,在进行数据处理时,表示形式具有相同的意义数据名具有地址的概念,可以代表数组的首元素的地址,可以把数组名(即在内存中存放该数组的首地址)赋给指针。
34.简述一下冒泡排序的主要思想
首先,将第一个元素与第二个元素比较大小,如果第一个比第二个大.则交换位置;接着对第二和第三个元素做同样的工作,直到结尾的最后一对,此时最后一个元素是该组数据最大的数。然后,除了这个最大的数,将剩余的其他数重复以上的步骤,直到没有任何一对数字需要比较;此时排序完成,该组数据从小到大依次排列。
35.简述一下选择排序的主要思想
首先,在这组元素中找到最小的元素,与第一个元素交换,此时数组的第一个元素是该数组中最小的元素;然后从第二个元素开始,再找出剩下的元素中最小的数,与第二个元素交换,如此下去,直到最后只剩下一个元素为止,此时排序完成,该组数据从小到大依次排列。
36.写出你所会的算法 用代码表示出来 至少三种以上
(1)冒泡排序
int a[10]=(1,3,5,7,9,2.4,6,8,10);
int i,j,t;
for(i=0;i<=8;i++)
for(j=0;j<=8-i;++)
if(a[j]>a[j+1])
{t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
(2)选择排序
Int a[10]={1,3,5,7,9,2,4,6,8,10};
int i,j.t,min:
for(i=0:i<=8:i++)
{min=i;
for(j=i+1;j<=9;j++)
if(a[j]<a[min])
min=j;
if(i!=min)
{t=a[min];a[min]=a[i];a[i]=t;}
}
37.typedef 和define 有什么区别
(1)用法不同:typedef 用来定义一种数据类型的别名,增强程序的可读性。define 主要用来定义 常量,以及书写复杂使用频繁的宏。
(2)执行时间不同:typedef 是编译过程的一部分,有类型检查的功能。define 是宏定义,是预编译的部分,其发生在编译之前,只是简单的进行字符串的替换,不进行类型的检查。
(3)作用域不同:typedef 有作用域限定。define 不受作用域约束,只要是在define 声明后的引用 都是正确的。
(4)对指针的操作不同:typedef 和define 定义的指针时有很大的区别。
38.共用体和结构体的比较
结构体变量所占内存长度是各成员占的内存长度之和。每个成员分别占有其自己的内存单元。
共用体变量所占的内存长度等于最长的成员的长度
39.共用体类型数据的特点
(1)同一个内存段可以用来存放几种不同类型的成员,但在每一瞬时只能存放其中一种,而不是同时存放几种。
(2)共用体变量中起作用的成员是最后一次存放的成员,在存入一个新的成员后原有的成员就失去作用。
(3)共用体变量的地址和它的各成员的地址都是同一地址。
(4)不能对共用体变量名赋值,不能企图引用变量名来得到一个值,不能在定义共用体变量时对它初始化。
(5)不能把共用体变量作为函数参数,不能使函数带回共用体变量,但可以使用指向共用体变量的指针。
(6)共用体类型可以出现在结构体类型定义中,也可以定义共用体数组。反之,结构体也可以出现在共用体类型定义中,数组也可以作为共用体的成员。
40.什么是文件型指针?通过文件指针访问文件有什么好处?
(1)文件型指针是:每个被使用的文件都在内存中开辟一个相应的文件信息区,用来存放文件的有关信息(如文件的名字、文件状态及文件当前位置等),指向这片内存的指针就是文件型指针。这些信息是保存在一个结构体变量中的,该结构体类型是由系统声明的,取名为FILE,相应的指针类型是FILE*。
(2)通过文件指针访问文件的好处是:可以随机访问文件,有效表示数据结构,动态分配内存,方便使用字符串,有效使用数组。
41.对文件的打开与关闭的含义是什么?为什么要打开和关闭
(1)“打开”是指为文件建立相应的信息区(用来存放有关文件的信息)和文件缓冲区(用来暂时存放输人输出的数据)。
(2)“关闭”是指撤销文件信息区和文件缓冲区,使文件指针变量不再指向该文件,显然就无法进行对文件的读写了。
42.ASCII文件和二进制文件的比较:
(1)ASCII文件便于对字符进行逐个处理,也便于输出字符。但一般占存储空间较多,而且要花费转换时间。
(2)二进制文件可以节省外存空间和转换时间,但一个字节并不对应一个字符,不能直接输出字符形式。
43.简述C语言中补码的含义
补码:在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值域统一处理;同时,加法和减法也可以统一处理。此外,补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路。
反码表示法规定:正数的补码与其原码相同;一种简单的方式,符号位保持1不变,数值位从右边数第一个1及其右边的0保持不变,左边按位取反。也可以从反码推补码,就是在反码的基础上加1。
举例:[+45]补=00101101 [-45]补=11010011
44.#include<> 与 #include“”的区别
(1)引用的头文件不同:
#include<>引用的是编译器的类库路径里面的头文件。
#include“”引用的是你程序目录的相对路径中的头文件。
(2)用法不同:
#include<>用来包含标准头文件(例如 stdio.h或 stdlib.h)
#include“”用来包含非标准头文件。
(3)调用文件的顺序不同:
#include<>编译程序会先到标准函数库中调用文件。
#include“”编译程序会先从当前目录中调用文件。
(4)预处理程序的指示不同:
#include<>指示预处理程序到预定义的缺省路径下寻找文件。
#include“”指示预处理程序先到当前目录下寻找文件,再到预定义的缺省路径下寻找文件。
45.while与do while的特点和不同
(1)相同点:都是循环结构,使用 while(循环条件)表示循环条件,使用大括号将循环操作括起来
(2)不同点:
1、语法不同。于 while 循环结构相比,do-while 循环结构将 while 关键字和循环条件放在后面,而且前面多了关键字 do,后面多了一个分号;
2、执行次序不同。while 循环结构先判断,再执行;do-while 循环结构先执行,在判断;
3、在一开始循环条件就不满足的情况下,while 循环结构一次都不会执行,do-while循环结构不管什么情况都至少执行一次。
47.什么是函数的定义与函数的声明?有什么不同
(1)函数的定义。函数的定义是一个完整的函数单元,包含函数类型、函数名、形参及形参类型、函数体等。在程序中,函数的定义只能有一次。函数首部与花括号间不加分号。
(2)函数的声明。函数声明只是对编译系统的一个说明: 函数声明是对定义的函数的返回值的类型说明,以通知系统在本函数中所调用的函数是什么类型。不包含函数体(或形参),调用几次该函数就应在各个主调函数中做相应声明。函数声明是一个说明语句,必须以分号结束。
48.全局变量与局部变量的作用域与生命周期
(1)生存周期和作用域的定义
生存周期:变量从定义到销毁的时间范围。存放在全局数据区的变量的生存周期存在于整个程序运行期间,而存放在栈中的数据则随着函数等的作用域结束导致出栈而销毁,除了静态变量之外的局部变量都存放于栈中。取决于变量存放位置.
作用域;变量的可见代码域(块作用域,函数作用域,类作用域,程序全局作用域)。取决于变量定义位置。
(2)全局变量
生命周期:程序运行期一直存在,从程序开始到程序结束;
作用域:全局作用域(只需要在一个源文件中定义,就可以作用于所有的源文件);
引用方法:其他文件如果要使用,必须用extern等关键字声明要引用的全局变量;
内存分布:全局(静态存储区)。
注意:如果再两个文件中都定义了相同名字的全局变量,则连接错误:变量重定义
(3)局部变量
生命周期:随着函数的结束,即被销毁。
作用域:局部作用域 (只在局部作用于可见)
内存分布:栈区
定义方法:在局部作用域中用 auto 指示符定义,可省略 auto
49.指针与数组的区别
数组:数组是用于储存多个相同类型数据的集合。
指针:指针是一个变量,但是它和普通变量不一样,它存放的是其它变量在内在中的地址。
(1)赋值
数组:只能一个一个元素的赋值或拷贝
指针:指针变量可以相互赋值
(2)表示范围
数组有效范围就是其空间的范围,数组名使用下表引用元素,不能指向别的数组指针可以指向任何地址,但是不能随意访问,必须依附在变量有效范围之内
(3)sizeof()
数组:
数组所占存储空间的内存:sizeof (数组名)
数组的大小: sizeof (数组名) /sizeof (数据类型)
指针:
在 32 位平台下,无论指针的类型是什么,sizeof(指针名)都是 4
在 64 位平台下,无论指针的类型是什么,sizeof(指针名)都是 8
50.简单描述C语言函数调用一般过程。
(1)为被调用函数的所有形式参数分配内存,并将实在参数的值,按从右向左的方式一一对应地赋给相应的形式参数(对于无参函数不做此工作)。
(2)程序控制由主调函数进人被调函数的函数体:依次执行被调用函数中变量定义部分,为局部变量分配存储空间,执行函数体中的可执行语每
(3)当执行到”return"语句时,计算返回值(如果是无返回值的函数,不做这项工作):释放本函数中定义的局部变量和形式参数所占用的存储空间(对于 static类型变量,其空间不释放),返回主调函数继续执行其他语句。
51.简单说明C语言用’\0’来作为字符串结束标志的原因
在c语言中不设有专门的字符串变量,往往用字符数组来存储字符串。且字符串通常都是以”\0’作为串的结束符。若把字符串存入数组时,往往也把’\0’存入数组,并且作为字符串的结束标志
52.跟踪调试程序的原理是什么,简述一般调试过程
(1)原理:在程序运行过程设置断点,观察某一阶段变量状态
(2)一般调试过程:
1、设置断点;
2、控制程序运行;
3、观察数据变化。
53.简述转义字符的用途并举例说明。
用途:转义字符具有特定含义,不同于字符原有的意义,主要用来表示那些用一般字符不便于表示的制代码。
比如:\n 表示回车换行,\t 表示水平制表,\b表示退格等。
54.简述算术运算类型转换规则(✔)
(1)当两个运算数类型相同时,运算类型结果与原类型相同:
(2)当两个运算数类型不同时,运算结果类型为级别较高的数据类型
55.简述输入函数printf中”格式字符串“的作用
格式字符串由两类项目组成:第一类是显示到屏幕上的字符,第二类是对应每个输出表达式的格式说明符。
56.论述gets 和 scanf区别以及功能
(1)gets可以接收空格;而scanf遇到空格、回车和 Tab 键都会认为输入结束,所以它不能接收空格。
例如:如果输入为"hello world”时,上面程序的运行结果是"hello world”。而如果用scanf则只能输出hello.
(2)scanf 对末尾回车符的处理: 把回车符保留在缓存中。gets 对末尾回车符的处理:接收回车,但把回车替换为\0.**
(3)gets 的返回值为 char*型,当读入成功时会返回输入的字符串指针地址,出错时返回NULL;scanf返回值为int型,返回实际成功赋值的变量个数,当遇到文件结尾标识时返回EOF。
(4)gets 函数仅用于读入字符串;scanf为格式化输出函数,可以读入任意 C语言
基础类型的变量值,而不是仅限于字符串(char*)类型。