【C++八股-第二期】C语言基础 - 24春招特供
提纲:(直接以面试官口吻进行题目设定,之后的帖子将不再重复这句话)
👉八股
1、请问你了解原码、反码和补码么,能不能简单概述一下?🔥🔥
2、简述一下全局变量和局部变量的区别?🔥🔥
3、C++有几种传值方式,之间的区别是什么?🔥🔥
4、请简述一下结构体和共用体的区别🔥🔥
5、主函数→int main(int argc, char ** argv)函数中,参数argc和argv分别代表什么意思?🔥🔥🔥⭐
6、简述一下数组和指针的区别🔥🔥🔥🔥🔥
7、简述数组指针与指针数组的区别🔥🔥🔥🔥🔥
8、指针函数与函数指针的区别🔥🔥🔥🔥🔥
9、请说说32/64位操作系统,某个数据类型字节数🔥🔥🔥🔥🔥⭐⭐
10、简单介绍一下sizeof
👉代码
👉任务打卡
===================================================
👉八股:
1、请问你了解原码、反码和补码么,能不能简单概述一下?🔥🔥
引入反码和补码是为了简化二进制数的减法运算;(作用)
在计算机内一个整数是通过二进制进行存储的,该二进制的最左边一位为符号位,0代表正数,1代表负数。
(1)原码(二进制):一个十进制数转化成的二进制数就是这个十进制数的原码。例如:8(十进制)的原码是0000 1000;
(2)反码:正数的反码与原码相同:如:8 原码为0000 1000,反码为0000 1000
负数为原码0变1,1变0,(符号位不变):如:-8 原码为1000 1000,反码为1111 0111
(3)补码:正数的补码与原码相同:如:10 原码为0000 1000,补码为0000 1000
负数的补码为反码加1:如:-8 反码为1111 0111,补码为1111 1000
口诀:正数都不变,反码0变1,补码反+1,引入为减法
注意:问你是什么不要只回答是什么,可以说一下作用之类的内容
2、简述一下全局变量和局部变量的区别?🔥🔥
(1)作用域不同:
- 全局变量的作用域为整个程序,
- 局部变量的作用域为当前函数或循环等
(2)内存存储方式不同:
- 全局变量存储在静态全局区(data)中
- 局部变量存储在栈区(stack)
(3)生命期不同:
- 全局变量的生命期和主程序一样,随程序的销毁而销毁,
- 局部变量在函数内部或循环内部,随函数的退出或循环退出就不存在了
(4)使用方式不同:
- 全局变量在声明后程序的各个部分都可以用到,
- 局部变量只能在局部使用。函数内部会优先使用局部变量再使用全局变量。
3、C++有几种传值方式,之间的区别是什么?🔥🔥
有三种:值传递、引用传递、指针传递
(1)值传递:形参,改变不会改变实参
(2)引用传递 &:形参,改变会改变实际的值
(3)指针传递 *:指针地址不变的条件下,值改变会改变实际值
4、请简述一下结构体和共用体的区别🔥🔥
(1)struct和union都是由多个不同的数据类型成员组成。
- struct的所有成员都存在;
- 但在任何同一时刻, union中只存放了一个被选中的成员。
(2)在不考虑字节对齐的情况下
- struct变量的总长度等于所有成员长度之和。
- Union变量的长度等于最长的成员的长度。
(3)赋值
- struct的不同成员赋值是互不影响的;
- union的不同成员赋值, 将会对其它成员重写, 原来成员的值就不存在了。
5、主函数→int main(int argc, char ** argv)函数中,参数argc和argv分别代表什么意思?🔥🔥🔥
首先先明确一下这个 int main(int argc, char **argv)是什么东西,类比到C++其实就是
```
#include <iostream>
using namespace std;
int main(){ return 0;} //就是这个int main
```
argv参数是为了你写脚本或者用DOS命令行,往里进行传参用的,类比python其实就是
```
$ python test.py 203 213 423 # 你写的这些像是203的参数就是传到main()里的argv里了
```
下面开始正文:
==============================
(1)int argc 命令行参数个数
- 用来统计程序运行时发送给main函数的命令行参数的个数(上面那个203等,就是3个)
- ps:命令行参数相当于外部的数据(以空格隔开,要是本身含空格要加上字符串"内容")
(2)char * argv[] 字符串数组
- 用来存放指向字符串的指针元素,每一个指针元素指向一个字符串参数。
- 各成员含义如下:
==============================
⭐6、7、8是送分题但是一定得会!!!
6、简述一下数组和指针的区别🔥🔥🔥🔥🔥
1.概念:
(1)数组:数组是用于储存多个相同类型数据的集合。 数组名是首元素的地址。
(2)指针:指针相当于一个变量,但是它和普通变量不一样,它存放的是其它变量在内存中的地址。指针名指向了内存的首地址。
2.区别:
(1)赋值:同类型指针变量可以相互赋值;数组不行,只能一个一个元素的赋值或拷贝
(2)存储方式:
- 数组:数组在内存中是连续存放的,开辟一块连续的内存空间。数组是根据数组的下进行访问的,数组的存储空间,不是在静态区就是在栈上。
- 指针:指针本身就是一个变量,作为局部变量时存储在栈上。
(3)求sizeof:
- 数组所占存储空间的内存大小:sizeof(数组名)
- 求数组的元素个数:sizeof(数组名) /sizeof(数据类型)
- 无论指针的类型是什么,32位平台永远是4,64位平台永远是8。
(4)初始化:
7、简述数组指针与指针数组的区别🔥🔥🔥🔥🔥
- 数组指针:是一个指针变量,指向了一个一维数组, 如int (*p)[233],(*p)[233]就成了一个二维数组,p也称行指针;
- 指针数组:是一个数组,只不过数组的元素存储的是指针变量, 如int *p[233]
助记:记住像是这种【指针 数组】AB结构的名词,他永远是个B,就是他一定是后面的那个名词形容的东西。
8、指针函数与函数指针的区别🔥🔥🔥🔥🔥
(1)定义不同:
- 指针函数本质是一个函数,其返回值为指针。 ps:AB结构是B
- 函数指针本质是一个指针,其指向一个函数。传给函数当参数就是告诉他用哪个函数(比如比较)
(2)写法不同:
- 指针函数:int *fun(int x,int y);
- 函数指针:int (*fun)(int x,int y);
(3)用法不同:
- 指针函数返回一个指针;
- 函数指针使用过程中指向一个函数。通常用于函数回调的应用场景;
- 我们调用别人提供的 API函数(Application Programming Interface,应用程序编程接口),称为Call;如果别人的库里面调用我们的函数,就叫Callback。
9、请说说32/64位操作系统,某个数据类型字节数🔥🔥🔥🔥🔥⭐⭐
10、简单介绍一下sizeof 🔥🔥🔥🔥🔥
sizeof 注意点:
- sizeof返回的数据结果类型是unsigned int; 这是个大坑
- 要注意数组名和指针变量的区别。通常情况下,我们总觉得数组名和指针变量差不多,但是在用sizeof的时候差别很大,对数组名用sizeof返回的是整个数组的大小,而对指针变量进行操作的时候返回的则是指针变量本身所占得空间,在32位机的条件下一般都是4。而且当数组名作为函数参数时,在函数内部,形参也就是个指针,所以不再返回数组的大小;
void test_for_sizeof(){ unsigned int a = 10; if (a - 11 < 0){ printf("结果小于0\n"); } else{ printf("结果大于0\n"); } int b = 5; if (sizeof(b) - 10 < 0){ printf("结果小于0\n"); } else{ printf("结果大于0\n"); } } 输出结果: 结果大于0; 结果大于0
👉代码:
注意:字节跳动面试的时候是要你从头到尾把程序写出来,同时自己进行测试用例的测试和输出,这意味着如果你只是刷那种写方法的算法题可能到时候会因为一个小失误而尬住;出于这个考虑我将结合leecode+acwing两个网站来进行题目的综合推荐
IDE的大概样子:👇
第一天:
- 1、快速排序 👉
- 2、归并排序 👉
- 3、用两个栈实现队列 👉
- 4、爬楼梯及其优化👉 ⭐
第二天:
- 1、从头到尾打印链表(链表反转) 👉
- 2、复杂链表的复制 👉
- 3、整数二分算法 👉
- 4、浮点数二分算法 👉
第三天
- 1、替换空格 👉
- 2、左旋字符串 👉
- 3、一维前缀和 👉
- 4、二维前缀和 👉
真题挑战
- 第一个缺失的正数 👉