c语言选择题常见知识点汇总 ------持续更新

简介: 当使用free释放掉一个指针内容后,指针变量的值不会被置为NULL,free不会更改指针指向、32位系统下任何类型指针的长度都是4个字节、指针的数据类型声明的是指针实际指向内容的数据类型、野指针是指向未分配或者已经释放的内存地址

1、当使用free释放掉一个指针内容后,指针变量的值不会被置为NULL,free不会更改指针指向


2、32位系统下任何类型指针的长度都是4个字节


3、指针的数据类型声明的是指针实际指向内容的数据类型


4、野指针是指向未分配或者已经释放的内存地址


5、回调函数一般不是函数的实现方调用,而是在特定的场景下,由另外一方调用


6、回调函数一般通过函数指针实现


7、回调函数就是一个通过函数指针调用的函数


8、下面程序结果为:

int main()
{
  int aa[2][5] = {10,9,8,7,6,5,4,3,2,1};
  int *ptr1 = (int *)(&aa + 1);
  int *ptr2 = (int *)(*(aa + 1));
  printf( "%d,%d", *(ptr1 - 1), *(ptr2 - 1));
  return 0;
}

  &aa的类型是int (*)[2][5],加一操作会导致跳转一个int [2][5]的长度,直接跑到刚好越界的位置。减一以后回到最后一个位置1处。*(aa + 1)相当于aa[1],也就是第二行的首地址,自然是5的位置。减一以后由于多维数组空间的连续性,会回到上一行末尾的6处。

9、assert宏可以通过编译选项进行启用或禁用

10、下面代码的结果是:

#include <stdio.h>
int main()
{
  int arr[] = {1,2,3,4,5};
  short *p = (short*)arr;
  int i = 0;
  for(i=0; i<4; i++)
  {
    *(p+i) = 0;
  }
  for(i=0; i<5; i++)
  {
    printf("%d ", arr[i]);
  }
  return 0;
}

指针p的类型为short*类型的,因此p每次只能所有两个字节,而整型数组arr中每个元素都是占四个字节,所以四次遍历结束后只能遍历八个字节也就是两个元素并不能将所有元素遍历完,故结果为:00345

11、32位系统下:int占4个字节,指针表示地址空间个数,总共有2^32个,故占4个字节


       64位系统下:int占4个字节,指针表示地址空间个数,总共有2^64个,故占8个字节


12、递归层次太深,会出现栈溢出现象


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


14、存在限制条件,当满足这个限制条件的时候,递归便不再继续


15、递归不可以无限递归下去


16、Debug为调试版本,一般在开发完成后发布工程前,调试代码都是在Debug模式下进行的


17、Release版本最终是要发送给用户的,发给用户的版本必须要没有问题,测试人员就是最后一个把关的


18、Debug版本是调试版本,编译器编译时会增加一些调试信息,编译器基本不会对其进行优化


19、Release版本是不能调试的,一般都是在Debug版本下调试的,Release版本一般编译器会进行大量的优化,删除无用的代码,指令的次序调整等,让其速度更快


20、F5是开始调试,在遇到短点的位置可以停下来,Ctrl+F5是开始执行,不调试


21、F10遇到函数时不会进入到函数体中,F11会


22、F11遇到函数时,会进入函数中


23、F9会在光标所在行下短点,如果有短点会取消短点


24、c语言常见的错误分类有:编译错误、链接错误、运行时错误。其中运行错误包含栈溢出


25、函数的定义可以放在任意位置,函数的声明必须放在函数的使用之前


26、函数的声明只是告诉编译器函数返回值类型、函数名字以及函数所需要的参数,函数定义才是说明函数是怎么实现的


27、strlen是库函数,求字符串长度,统计\0之前出现的字符的个数


28、sizeof是操作符,计算的数据占据内存的字节数,不在乎内存具体存储什么


29、strlen在求字符串长度的时候,要求字符串中必须有\0,否则可能计算出随机值


30、rand函数生成了0~32767之间的随机数


31、rand函数在使用之前,需要调用srand函数设置随机数的生成器


32、rand函数的使用需要包含stdlib.h的头文件


33、switch(c)语句中,c不可以是float类型, switch语句中表达式的类型只能是:整形和枚举类型


34、C语言的关系操作符就是用来比较大小关系的


35、关系操作符中判断是否相等使用==


36、两个字符串是否相等不能使用==,应该使用strcmp函数


37、关系操作符参与的关系表达式,通常返回0或1,表示真假


38、scanf需要包含stdio.h这个头文件的


39、scanf的占位符%s表示读取一个字符串,遇到空白字符就停止读取


40、scanf()处理数值占位符时,会自动过滤空白字符,包括空格、制表符、换行符,scanf输出字符占位符的时候,不忽略空白字符,总是返回当前第一个字符,无论该字符是否为空格,而gets()不会过滤


41、scanf中也有占位符,占位符和后边的参数提供的地址一一对应


42、局部变量是放在内存的栈区的,全局变量是放在内存的静态区


43、布尔类型是C99标准中引入的


44、下面代码输出的结果是:

#include <stdio.h>
int num = 10;
int main()
{
    int num = 1;
    printf("num = %d\n", num);
  return 0; 
}

结果为1,这是因为在C语言中存在这样的规则:

 1. 不允许在同一个作用域中定义多个相同名称的变量


         比如:在一个班级中存在两个名字相同的学生王帅,当老师点王帅回答问题时,那个回答就冲突了


 2. 允许在不同的作用域中定义多个相同名称的变量


        比如:两个班级中各有一个王帅,老师在A班中点王帅回答问题,不会有任何歧义


 3. 不同作用域中定义的变量,在访问时采用就近原则。


         比如:你们村有一个小伙伴名字叫刘德华,那你在你们村喊刘德华时,你们村的刘德华就会跑过来响应你,而我们世界级别人见人爱的天王他不会理你,因为距离远听不见,但是两个刘德华可以同时存在这个世界上,只要不在一个村就不会冲突。

45、C语言中内置类型包括:

  char    //字符数据类型
  short    //短整型
  int     //整形
  long    //长整型
  long long  //更长的整形
  float    //单精度浮点数
  double   //双精度浮点数

46、小写字母的ASCII码值-32就能得到对应的大写字母的ASCII码值


       小写字母的ASCII码值比对应的大写字母的ASCII码值更大的


47、ASCII码值从0~31 这32个字符是不可打印字符


48、数字字符0~9的ASCII码值是连续递增的


49、最初ASCII编码中只有128个字符的编码


50、集成开发环境简称IDE


51、集成开发环境一般都是将编辑、编译、链接、调试等功能集成在一起的一个开发环境


52、集成开发环境中集成了编译器,如果说集成开发环境就是编译器,有些片面了


53、集成开发环境使用起来方便,大大提升了开发和调试的效率


54、switch中常用的关键字:case 、break、 default,当然case中语句比较复杂时,可能会用if进行判断,而continue是用来结束本次循环的,但是switch不是循环,因此其中不能使用continue关键字


55、函数可以传值调用,传值调用的时候形参是实参的一份临时拷贝


56、函数可以传址调用,传址调用的时候,可以通过形参操作实参,修改形参指针指向的内容,  就是在操作实参


57、函数可以嵌套调用,但是不能嵌套定义


58、函数不能嵌套定义

59、能把函数处理结果的二个数据返回给主调函数,在下面的方法中不正确的是:(A)

A.return 这二个数    //一个函数只能返回一个结果


B.形参用数组           //将形参存在数组中,修改数组中内容,可以通过数组将修改结果带出去


C.形参用二个指针   //形参如果用指针,最终指向的是外部的实参,在函数中对指向指向内容进行修改,改变的就是外部的实参


D.用二个全局变量   //全局变量不受函数的结束而结束,在函数中改变全局变量,主调函数中可以看到改变之后的结果

59、printf()参数与占位符是一一对应关系,如果有n个占位符,printf()的参数就应该有n+1个



60、printf()可以在输出文本中指定占位符,“占位符”,就是这个位置可以用其他值代入


61、printf()不会在行尾自动添加换行符,运行结束后,光标就停留在输出结束的地方,不会自动换行


62、printf()的作用是将参数文本输出到屏幕。它名字里面的f代表format(格式化),表示可以定制输出文本的格式


63、除号两边只要有一个是小数,就执行小数除法


64、%操作符的操作数只能是整数


65、%操作符计算的结果是两个操作数整除之后的余数


66、负数求模的规则是,结果的正负号由第一个运算数的正负号决定


67、'\n' 转义字符,代表换行


68、'\060' 转义字符,060八进制数据,十进制为48,表示ASCII码为48的'0'


69、'\b' 转义字符,表示退格


70、'\q' 什么都不是


71、有了优先级和结合性,表达式也有可能有不同的计算路径,导致计算结果的差异


72、下面代码的结果是:

#include <stdio.h>
int main()
{
    int i = 1;
    int ret = (++i)+(++i)+(++i);
    printf("ret = %d\n", ret);
  return 0;
}

 结果为:程序错误。这是因为表达式(++i)+(++i)+(++i),只有操作符的优先级和结合性,没法确定唯一计算路径所以这个表达式可能因为计算顺序的差异导致结果是不一致的即可以前两个先计算后或者后两个先计算,所以表达式错误。


可以在VS和Linux gcc测试,结果可能有差异。


73、相邻操作符的优先级相同的情况下,看操作符的结合性决定计算顺序

相关文章
|
2月前
|
存储 编译器 Linux
C语言易错知识点总结2
C语言易错知识点总结2
23 0
|
2月前
|
存储 编译器 C语言
C语言易错知识点总结1
C语言易错知识点总结1
19 0
|
5月前
|
移动开发 Unix C语言
日常知识点之c语言按行读配置文件,及行尾符CRLF导致的问题
日常知识点之c语言按行读配置文件,及行尾符CRLF导致的问题
46 0
|
5月前
|
C语言
C语言—每日选择题—Day60
C语言—每日选择题—Day60
|
5月前
|
编译器 C语言
C语言—每日选择题—Day61
C语言—每日选择题—Day61
|
5月前
|
编译器 C语言
C语言—每日选择题—Day57
C语言—每日选择题—Day57
|
5月前
|
C语言
C语言—每日选择题—Day56
C语言—每日选择题—Day56
|
2月前
|
C语言
[日常]C语言作业详解12_17(题型对应知识点)
[日常]C语言作业详解12_17(题型对应知识点)
29 0
|
2月前
|
存储 程序员 测试技术
【详解】C语言冷门知识点之--位段
【详解】C语言冷门知识点之--位段
|
7天前
|
编译器 Linux C语言
C语言:预处理详解(知识点和代码演示)
C语言:预处理详解(知识点和代码演示)