C语言---常见问题汇总(适合新手学习、高手自查)

1、一段程序从编写到最终实现需要经历什么?

答:利用C语言写的程序是源程序,计算机不能直接识别和执行,必须经过编译系统经过编译,把源程序翻译成二进制形式的目标程序,在将该目标程序与系统的函数库以及其他程序连接起来,形成可执行的目标程序。下图为整个流程:

注:1、源程序为.c文件里面编写的程序,目标程序是经过编译后形成的.obj文件,可执行目标程序是经过连接的.exe文件。

2、程序在经过编译的时候,是以源程序文件为单位进行编译的。

2、为什么整型数据在计算机需要以二进制补码的形式进行存储?

答:首先在计算机内部数据的存储和运算都采用二进制,是因为计算机是由很多硬件电路组成的,而电路通过高低电平(或者有无电脉冲)的两种状态,恰好可以用二进制的0和1表示,并且采用二进制可以使得计算机内部的运算规则简单,稳定性高。

        在二进制中,存在补码、原码、反码三种码型,那为什么要以补码的形式存储呢?

1、能够统一+0和-0的表示

  采用原码表示,+0的二进制表示形式为0 000 0000,而-0的二进制表示形式为1 000 0000;

  采用反码表示,+0的二进制表示形式为0 000 0000,而-0的二进制表示形式为1 111 1111;

  采用补码表示,+0的二进制表示形式为0 000 0000,而-0的二进制表示形式为1 111 1111+1=1 0000 0000,因为计算机会进行截断,只取低8位,所以-0的补码表示形式为0000 0000。

2、对于有符号整数的运算能够把符号位同数值位为一起处理
  由于将最高位作为符号位处理,不具有数值意义,那么如何在进行运算时处理这个符号位?如果单独把符号位进行处理,显然又会增加电子器件的设计难度和CPU指令设计的难度,但是采用补码能够很好地解决这个问题。

3、能够简化运算规则

对于-1+3=2这个例子来说,可以看作是3-1=2,也即[3]+[-1]=2,从上面的运算过程可知采用补码运算相当于是[3]补+[-1]补=[2]补,也即可以把减法运算转换为加法运算。这样一来的好处是在设计电子器件时,只需要设计加法器即可,不需要单独再设计减法器。

3、单行注释与多行注释的区别?

答:单行注释是以//看是的,此种注释范围是从//开始,以换行符结束;多行注释是以/*开始,以*/结束,在这个区间之内的所有内容都是注释。

4、为什么输入函数scanf需要取变量地址符&,而输出函数printf不需要取变量地址符&?

答:scanf需要对我们变量的值,在函数内进行修改,所以需要指针通过我们变量的地址对变量值进行修改。而printf只需要将我们变量的值传递到函数中就可以。

5、什么是数据结构?什么是算法?

答:对数据的描述,在程序中要指定用到哪些数据,数据的类型以及数据的形式是数据结构;对数据进行的操作步骤、方法称为算法;总的来说,算法是灵魂,数据结构是加工对象,语言是工具,编程需要合适的方法。

6、字符常量与字符串常量的区别?

答:字符常量包括普通字符以及转义字符,字符常量都是用''进行使用,形如:'A';且单撇括号只能包含一个字符。字符串常量是用双撇括号括起来的,形如:"BOY";

7、什么是常变量?有什么特点?

答:在定义变量的时候,前面加一个关键字const,如:const int a=2;则定义一个整型变量指定值为2,而且在白能量存在期间的值不会改变。常变量具有变量的属性,有类型,且占据内存单元(常量不占据内存单元),只是不允许改变其值

8、什么是数据类型?

答:在定义变量的时候需要指定变量的类型,因为在定义变量的时候,计算机会给变量划分存储单元,所谓的类型是指在对数据分配存储单元时,说明需要安排存储单元的长度(占据字节的多少)以及数据的存储方式。

9、字符‘1’与整型1的区别?

答:字符‘1’是代表一个形状为‘1’的符号,是一个字符型的量。在内存中以ASCII码的形式存储,占据1个字节。而整数1是以整数存储方式(二进制补码)存储占据4个字节。此外,字符‘1’+‘1’并不等于整数2或者字符‘2’,整型1+1=2(整数)。

10、浮点型数据的精度是什么意思?

答:浮点数在内存中进行存储时,是以指数形式存储的,例如:3.14159,可以表示为3.14159×10^0,在内存中,系统将实型数据分为小数部分和指数部分进行分别存放。如3.14159在内存中存放的形式为:

        在4个字节(32位)中,有部分比特表示小数部分,有部分比特表示指数部分,由于用二进制形式表示一个实数以存储单元的长度是有限的,因此可能有时不能完全精确到一定程度,小数部分占据的越多,数的位数就越多,精度也就越高。指数部分占据的越多,表示数值的范围就越大。

11、++i与i++的区别?

答:++i是先执行i=i+1;在使用i的值,而i++,是先使用i的值,在执行i=i+1;

12、什么是强制类型转换?

答:利用强制类型转换将表达式转换为所需类型。形式为:

(类型名)(表达式)

例如:a=(int)x;如果已经定义x为float型,a为整型变量,进行强制类型运算后得到一个int型的临时值,它的值为x的整形部分,赋值给a,注意x的值和类型都为变化,仍未float,在赋完值后,临时值就不存在了。

13、#include<>与#include" "的区别是什么?

答:包含头文件的作用是文件包含在程序中,随程序进行预编译时,系统会将存放在该头文件的内容调出来。

        用尖括号时,编译系统从存放编译系统的子目录中找所包含的文件,称为标准方式。用双撇号,在编译时,编译系统先在用户的当前目录中寻找包含的文件(一般为存放源程序文件的子目录)。所以一般引用系统的库函数,就用<>.引用自己写的头文件就用"",以便系统能找到所需的文件。

14、default语句的作用?

答:C语言中,选择结构有if语句与switch语句,其中在switch中,先计算switch后面“表达式”的值,然后将它与各个case标号比较,如果与某一个case标号中的常量相同,流程就跳到case标号后面的语句,如果没有与switch表达式相匹配的case常量,流程转去执行default标号后面的语句。

        可以没有default语句,此时如果没有与switch表达式相匹配的case常量,则不执行任何语句,流程转到switch标号后面的语句。

15、switch语句中break语句的作用是?

答;一般情况下,在执行完case子句后,应当跳出switch语句结构,这时候break语句的作用就是使流程跳出switch结构,即终止switch语句。如果没有break语句,程序从一个case入口,开始执行,一直将此入口后面的所有case都会执行一次。

16、while循环与do ……while 循环的区别?
答:while循环是先判断条件表达式,再执行循环体的语句。do……while 循环是先执行一次循环体,然后判断循环条件是否成立,再决定要不要继续执行循环。

17、break语句在循环中的作用?

答:注意break语句只能用于switch语句与循环语句,不能单独使用。break在循环中的作用是直接跳出循环,如果有多层循环,则跳出最外层的循环。

19、break语句与continue语句的区别?

答:continue语句只是结束本次循环,而不是终止整个循环的进行,而break语句则是结束整个循环的过程,不在判断执行循环的条件是否成立。

20、什么是数组?

答:数组是一种特殊的变量,能够使内存给与一段连续的地址,在这段地址内存放一组具有相同属性的元素数据。

21、字符数组与字符串的区别?

答;字符型数据是以字符的ASCII码存储在内存中的,一般占据一个字节,而字符数组是这些字符型数据的一个集合,存取多个字符型数据。在C语言中,字符串是作为字符数组进行处理的,但是字符串在内存中的存储与单纯的字符数组存储不同,字符串会有一个结束标志‘\0’用于判断字符串的长度。

22、sizeof与strlen的区别?

答:1、sizeof是一个操作符,适用于计算数组、变量、指针、类型符等所占内存空间的大小,它并不关注内存中存放的具体内容,不关心里面存放了多少数据;

2、strlen是一个用来计算字符串长度库函数,它只关心存储的数据内容,不关心空间大小和类型。

        那么为什么会有人把他俩分不清呢?关键点在于字符型数组。我们讲过C语言中,没有字符串类型,字符串是以字符型数组在内存中存放的,另外,在C语言系统中,字符数组存储字符串是会自动加上一个'\0'。这就容易把大家搞混,别急,我下面举例子说明:例1:

#include <stdio.h>
#include <string.h>
int main()
{
    char arr1[]={"Chian"};
    int ret =sizeof(arr1);
    int ret1 =sizeof(arr1)/sizeof(arr1[0]);
    int ret2=strlen(arr1);
    printf("%d\n",ret);
    printf("%d\n",ret1);
    printf("%d\n",ret2);
    return 0;
}

 我定义一个数组arr1,里面存放"China",

        当用sizeof(arr1)计算的是整个数组的长度,为6字节;

        当用sizeof(arr1)/sizeof(arr1[0])计算的是数组的长度/数组中一个元素的长度,计算数组的元素个数也为6;

        当用strlen(arr1)计算的数组中字符串的长度为5;

        数组arr1在内存中的存储方式如图所示,sizeof计算整数数组所占的字节,由于是字符串在数组中有'\0',所以计算占用6个字节,sizeof(arr1)/sizeof(arr1[0])是总字节(6)/单个字节(1),6个元素。strlen计算字符串长度,遇到'\0'截至,长度为5;数组长度不等于字符串长度;

23、定义函数应该包含函数的哪些信息?

答:在C语言中,函数必须先定义后使用,定义函数要包括函数的名字、返回值类型、实现的功能、参数的个数以及类型。

1、指定函数的名字,一般函数的名字就会体现出函数的功能,函数的名字用于后面对函数的调用。

2、指定函数的类型,即函数返回值类型,如果不需要返回值函数的类型定义为void。

3、函数的参数(名字及类型)以便函数进行调用时,对其进行数据的传递。

4、指定函数的功能,即定义这个函数是干什么的,这也是最重要的部分;

24、在声明函数应该包含哪些信息?

答:在一个函数中调用另外一个函数时,具有以下要求:1、被调函数是库函数或者已经被用户自定义;2、使用库函数,应该在文件的开头包含库函数的头文件;3、如果使用自己定义的函数,二定义函数的位置在调用函数位置的后面,就应该在主调函数中对被调函数作出声明。

       函数声明作用:1、告诉编译器有一个函数叫什么,参数是什么,返回类型是什么,但具体是否存在,函数声明决定不了。2、函数声明一般出现在函数的使用前面,要满足先声明后使用。3、函数的声明一般放在头文件中;

25、什么是函数的递归调用?

答:在利用函数实现模块化程序设计时,直接或间接调用该函数本身,称为函数的递归调用。

26、递归调用的两大特点?

答:  1、存在限制条件,当满足这个限制条件,递归便不在继续;

        2、每次递归调用之后越来越接近这个限制条件。

        一个递归问题分为“回溯”与“递推”两个过程;

27、什么是数组名传参?

答:在利用函数实现模块化程序设计的时候,调用函数时,可能会向被调用的函数进行传参,当传过去的参数为一个数组的数组名时,称为数组名传参,数组名传参的特点是,传过去的是一个数组名,数组名又是首元素地址,所以相当于传过去了一个指针。在形参定义参数时,也应该定义一个数组,或者指针。只是这样并不会将数组中的值传过来而是将数组的首元素地址传过来,形参获得实参数组的首元素地址,可以认为形参数组与实参数组具有同一地址,它们占据同一单元,具有的值。

28、什么是局部变量?什么是全局变量?

答:在定义变量时,一个变量的有效范围只在某一函数中使用,在其他函数中不能使用,或者只能在一些复合语句中进行使用,此外不能使用,这些变量称为“局部变量”;

在函数外定义的变量为全局变量,全局变量可以为本文件的其他函数共用。它的有效范围从定义到本源文件结束。

29、指针和地址的区别?

答:指针是地址的形象化,意思通过指针可以找到以它为地址的内存单元。

如果有一个变量专门存放另一个变量的地址,则称它为指针变量,指针变量就是地址变量,是用来存放地址。指针变量的值是地址,但是我们口头常说的指针是指指针变量。

区分指针和指针变量这两个概念,指针是一个地址,指针变量是一个存放地址的变量。

30、什么是野指针?

答:  概念:野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的);

三种常见的野指针:1、指针未初始化;2、指针的越界访问;3、指针指向空间释放。

31、什么是指针数组?什么是数组指针?

答:指针数组,重点在于数组,是一个元素全部是指针的数组,存放的内容都是指针。例如:

数组指针: 重点是指针,整型指针:指向整型的指针,字符指针:指向字符的指针。数组指针:指向数组的指针。

32、 什么是函数指针?

 答:类比数组指针,数组指针是指向数组的指针。那么简单来说函数指针就是指向函数的指针。那这样来说,函数也应该是有地址的,定义一个指针变量,将函数的地址放在指针变量之中,就说这个指针是函数指针,也就是说这是一个指向函数的指针。

33、*与++的优先级?

答:例如*p++;由于*与++的优先级相同,结合方向为自右至左,因此它等价于*(p++)。

34、什么是结构体?

答:结构体:是C语言中允许用户自己建立不同类型数据组成的组合型的数据结构。简单来说,结构体是一些值的集合,这些值是成员变量,结构体的每个成员可以是不同的类型。与数组不同的是,数组的元素具有相同的属性,而结构体成员的类型可以不同。

struct  peo//结构体类型
{
    char name[20];
    char tele[12];
    char sex[5];
    int high;
}  p1,p2;

         如上所示,为一个结构体的定义,struct为关键字(不能省略),说明其为结构体的类型变量,peo为标签,也为结构体名,{}内部为结构体的成员列表包括不同的成员变量,p1,p2为结构体变量名

35、什么是结构体指针?

答:指向结构体对象的指针变量可以指向结构体变量,也可以指向结构体数组中的元素,指针变量的类型必须与结构体变量的类型相同。

 P为一个指针,将结构体的地址存放在P中,则P指向结构体。

如果有不懂的,或者有歧义的地方,欢迎大家在讨论区留言讨论。

创作不易,还请多多点赞支持。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值