c语言面试知识点,c++语言面试
目录
首先,大小端的字节顺序
1.大小头介绍
2.什么是大端小端?
3.百度真题
思考
代码执行
4.工作补充
第二,深入理解静态关键词
1 .静态修改局部变量
2.静态修改全局变量
3 .静态修改器函数
三、深度切割常量关键词
1.const修改变量
2.常量变量可以是数组的一部分吗?
3.const修改指针
第四,手写字符串长度函数(strlen)
1.方法1:普通解决方案
2.方法2:递归方法
3.方法3:指针-指针
动词(verb的缩写)手写字符串复制功能(strcpy)
六、遇见安然遇见你,不辜负守则!
[前言]
为了考察自己对C语言的掌握程度,我特意在论坛整理了近百篇C/C R&D方向的面授经典,发现很多知识点都是被频繁考察的。下面,我就把这些高频考点分享给大家,让铁汁同学们看看自己能答对多少题。(对了,C语言的内容其实非常多,这里的“学完C语言”只是指学完C语法之后)
[声明]
下面总结的内容可能并不详尽,后面还会补充。
【注意】:博主刚刚建立了一个社区和QQ学习群,链接和二维码在最下面。欢迎加入我们!
首先,大小end 1的字节顺序。浆液端的介绍。请看下面的代码:
#包含stdio.h
int main()
{
int a=0x11223344//以十六进制形式将其赋给
返回0;
}
显然,它是以错误的顺序存储在内存中的。为什么?这里我们就来介绍一下大小头。
2.什么是大端小端?
大端存储:
当数据的低位放在高位地址时,数据的高位放在低位地址;
小端存储:
当低位数据放在低位地址时,高位数据放在高位地址。
比如上面的栗子:
3.百度真题
我们来看看15年百度的一个10分笔测吧!
百度2015年系统工程师钢笔试题(10分):
请简述大端和小端的概念,设计一个小程序判断当前机器的端序。
所有的概念都在上面,请看如何设计一个小程序来判断。
思考
您可以定义一个整数变量并将其初始化为1,这样它到十六进制表示形式的转换就是0x00 00 00 01。如果当前机器是小端存储,那么从低位地址到高位地址是01 00 00 00;如果当前机器是大端存储,那么从低位地址到高位地址是00 00 00 01;所以区别就是一个是01,一个是00在低位地址,那么怎么判断呢?在这里,你可以使用前面的指针学习的解引用操作,但是对于整数指针,你可以一次访问4个字节,我们想要的只是读取1个字节。所以需要进行强制类型转换,将int*转换为char*类型,这样在指针解引用时,一次只能访问一个字节的内容。
分析很简单。下面是如何编写代码:
执行代码# includesdio.h
int main()
{
int a=1;//00 00 00 01
char * p=(char *)a;
if (1==*p)
{
Printf(小端\ n );
}
其他
{
printf( big end \ n );
}
返回0;
}
上面的代码只是为了方便大家理解。其实如果给面试官看,这样写代码会很low,所以下面是完整的回答:
#包含stdio.h
int check_sys()
{
int a=1;//0x00 00 00 01
return(*(char *)a);//返回0-大端;1-小端
}
int main()
{
int ret=check _ sys();
if (1==ret)
{
Printf(小端\ n );
}
其他
{
printf( big end \ n );
}
返回0;
}4.作业补充无符号int a=0x1234
无符号字符b=a;
在32位大端处理器中,变量B等于()
答:0x00
乙:0x12
C:0x34
D:0x1234
//很明显,答案是A,因为实际上0x00001234是放在A里的。
问:字符类型有什么端序问题吗?
回答:不能,因为字符类型只有一个字节,那怎么谈字节顺序呢?
第二,深入理解静态关键词
整理了几百个面经,发现static、extern、const、struct等关键词。都是大部分公司考察的重点,而且考察相当频繁,其中不乏知名厂商!
下面详细描述static关键字:
静态——“静态”
在C语言中,Static用于修改变量和函数。
修改局部变量——静态局部变量修改全局变量3354静态全局变量修改函数——静态函数
1.static修改局部变量//代码1
#包含stdio.h
无效测试()
{
int a=1;//局部变量A的作用域在test()中。当A超出范围时,它将被销毁。下次调用test()时,需要重新创建它。
a;
printf(%d ,a);
}
int main()
{
int I=0;
for(I=0;i 10我)
{
test();
}
返回0;
}
//代码2
#包含stdio.h
无效测试()
{
//static修改局部变量a。
静态int a=1;
a;
printf(%d ,a);
}
int main()
{
int I=0;
for(I=0;我我)
{
test();
}
返回0;
}
看,上面两段代码几乎一样,只是第二段代码中,自定义函数test()用static修改局部变量,所以有这样的区别。
根据代码2的结果,推断每次调用test()时,使用的A是最后一次函数调用留下的A;第二次调用test()时,因为上一次函数调用生成的A没有被销毁,所以不会再创建一个,直接跳到下一步,A。
[敲黑板]:
static在修改一个局部变量的时候,实际上是改变了变量的存储类型,从堆栈存储变成了静态存储,从而使得静态局部变量脱离了自己的作用域,没有被销毁,实际上相当于改变了这个变量的生命周期。
这里补充一点知识点:
内存是一个比较大的空间。在使用内存的时候会分为不同的功能区:堆栈区、堆区、静态区(这里直接说这个是为了更好的理解,后面会详细介绍)
2.静态修改全局变量//代码1
//add.c文件
int g _ val=2018//g_val是add.c文件中定义的全局变量。
//test.c文件
//如果要使用其他文件(外部文件)的全局变量,应该先声明。
extern int g _ val
//extern是一个关键字,用来声明外部符号。
int main()
{
printf(%d\n ,g _ val);
返回0;
}上面的程序编译正常,下面的程序不行。
/代码2
//add.c文件
静态int g _ val=2018
//test.c文件
extern int g _ val
int main()
{
printf(%d\n ,g _ val);
返回0;
}第二个程序编译时,会因为连接错误而报错。
[解释]
全局变量可以在整个项目的其他子文件中使用,因为它具有外部链接属性。什么是外部链接属性?一个变量在一个文件中定义,但它可以在另一个文件中使用(访问)。当全局变量用static修饰时。其外部链接属性成为内部链接属性;这个全局变量只能在自己的源文件内部使用,其他文件都不能再用了,因为它不再具有外部链接属性,给我们的感觉是范围变小了。此外,局部变量只有内部链接属性。
3 .静态修改函数//代码1
//add.c文件
int Add(int x,int y)
{
返回x y;
}
//test.c文件
extern int Add(int x,int y);
int main()
{
printf(%d\n ,Add(2,3));
返回0;
}上面的程序编译正常,下面的程序编译有错误。
//代码2
//add.c文件
静态int Add(int x,int y)
{
返回x y;
}
//test.c文件
extern int Add(int x,int y);
int main()
{
printf(%d\n ,Add(2,3));
返回0;
}编译此程序时出现连接错误。
因为函数本身就有外链属性,所以当static修改函数时,函数本来就有外链属性,但是被static修改后,就变成了内链属性,导致这个函数只能在自己的源文件内部使用,给我们的感觉就是改变了范围。
第三,深入剖析const关键字1.const修改变量
【注意】:const修改的只读变量不能直接修改。
//不能直接修改由//const修饰的只读变量。
const int a=10
a=20//错误
问:被const修改的变量真的不能修改吗?
其实const修改的变量是可以间接修改的。
//被//const修改的变量可以被间接修改。
const int i=10
int * p=I;
* p=20
printf(%d\n ,I);//打印20
在这种情况下,有一个问题:const修改变量的意义是什么?
让编译器执行直接修改检查;告诉其他程(那些修改你的代码或阅读你的代码的人)不要更改这个变量。它也意味着“自我描述”
2.常量变量可以是数组的一部分吗?const int n=10
int arr[n]={ 0 };
注意上面的代码在VS编译器(standard C)下直接报错了,但是在gcc(GNU extension)下可以正常编译,所以我们要把一切都和标准对齐。在这种情况下,它不能!上面的定义是错误的。
3.const修改指针
面试问题:const*和*const有什么区别?
const修改指针时(有两种):
Const放在* (const int*p)的左边,修改*p,使*p不可更改(指针指向的内容不能被指针修改),但指针变量p本身可以更改;
Const放在* (int* const p)的右边,修改p,使p不能改变。但是*p是可以修改的。
标题描述:
下面哪个选项声明了一个指向char类型变量的指针p?p的值不能修改,但是p指向的变量的值可以修改?C
a:const char * p;//const修改*p
b:char const * p;//const修改*p
c:char * const p;//const修改p
d:const char * const p;//const同时修改*p和p。
思路:其实我们一看到p的值不可修改这个标题,就应该想到const放在*的右边。
四、手写字符串长度函数(strlen)库函数strlen()原型:
1.方法1:普通溶液//方法1:普通方法
int my_strlen(const char* str)
{
断言(str);//最好添加断言
int count=0;
while (*str)
{
数数;
}
返回计数;
}2.方法2:递归方法int my_strlen(const char* str)
{
//查找重复:my_strlen(str 1)是原问题的重复
//找到边界
if (*str==\0 )
{
返回0;
}
返回my _ strlen(str 1)1;
}3.方法3:指针-指针//方法3:指针-指针
int my_strlen(const char* str)
{
断言(str);//最好添加断言
char * end=str
while(结束)
{
;
}
返回end-str;
}
动词(verb的缩写)手写字符串复制功能(strcpy)
//这个问题有两点需要注意:
//首先,str1应该足够大
//第二个是保存str1的第一个地址。
char* my_strcpy(char* str1,const char* str2)
{
断言(str 1 str 2);//最好添加断言
char * ret=str1//注意,记得保存str1的第一个地址
while (*str1=*str2)
{
;
}
返回ret
}
【敲黑板】:这个问题有两点需要注意:
Str1应该足够大以容纳str1的第一个地址。
六、遇见安然遇见你,不辜负守则!今天到此为止,后续会继续更新。目标大厂,从最基础的知识点入手!
有所得,求三连~
最近忙着复习准备期末考试,所以铁志的很多私信没有及时回复。真的很抱歉,于是我建立了一个QQ群,里面有很多资料,有C/C R&D方向的书,Java R&D方向的书,还有很多算法方面的书。欢迎你加入我们。有问题可以发到群里,我们一起讨论。总之,拒绝平躺,向大厂冲刺!
QQ群号:926297014
安然无恙。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。