编译器/C语言中的指令-机器指令
3.生成项目(编译):*.exe
F7(出现00error为程序已经创建成功)
debug版本(调试版本)
release版本(发布版本) 编译器会优化掉一部分无用代码
内存的单位是字节(Byte) 每个字节占8个位(bit)
每个运行中的程序(进程)都有4G内存
内存不是内存条,是空头支票
变量类型就是告诉系统(编译器)我需要的内存有多大
变量名告诉系统(编译器)我需要的内存在哪里,变量名是地址的别名
变量类型 变量名称 = 值;
每种类型的变量,存储的数据都是有范围,超过这个范围的数据,将会被计算机丢弃,如:
变量宽度(字节byte)16进制 |
---|
内存编号就是内存地址,别名就是变量名
使用&地址符号,获得当前地址的内存
内存太多,使用编号代替,一个内存的编号就是地址,一个地址里面代表一个字节,一个字节就是八个0或者1
放到函数里面必须有一个明确的初始值
放到函数外面称为全局变量
变量的本质是容器,里面可以存储任意类型的数据
可以根据用户输入圆的半径,计算出圆的面积。
常量是一个数,不会变化
用变量是为了临时储存数据
大端小端针对的是数据超过1个字节的存储
小端模式:数据低位在内存地址编号低位,数据高位在高位
大端模式:数据高位在内存地址编号低位,数据高位在低位
程序在断点才可以看memory
float使用二进制规范存储,将小数点变为二进制IEEE规则
getchar()因为程序一直在运行,所以无法进行调试,需要删除掉
选择断点-把要看的变量名输入到address输入框中-查看存储的内存地址
如何让程序运行到某阶段的存储下来
浮点型有自己的存储规范,课堂上不涉及
当存储的12时是12,负数的时候存储的是EE
原码:最高位为符号位,其余各位为数据本身的绝对值
0X12 = ;//正数,最高位0正,最高位1为负
负数:符号位为1,其余位取反
负数:符号位为1,其余位对原码取反加1
原码://符号位为1,负数
反码://符号位为1,取反
计算机存储整数的时候存储补码
谁能告诉我下面的1代码表示什么?
%u:无符号数的输出标记
%d:有符号数的输出标记
有符号数与无符号数在存入内存的时候是相同的,比如
%x:十六进制输出标记
%p:类似于地址,全部位输出标记
fffff ff//有符号数,使用符号位进行补位
只有整数才有有符号与无符号之分
单引号==’ '==只是单个字符
putchar()
只能打印一个字符,给他任何数字都会进行查表,然后输出表的对应值
结果:因为没有0结束,会出现一些别的打印结果
所谓字符串是以数组的形式来表示的
输出打印字符串需要见到0才能停止,当数组扩大,会自动补0
一般情况下不用指明长度,编译器会计算长度,自动补0。
英文字符查表,中文如何操作的呢?
中文也有值,每个中文字有两个字节的占格
计算机发明之后及后面的很长一段时间,只用应用于美国及一些西方国家
我们专家把那些127之后的奇异符号们(EASCII)取消掉
规定两个大于127的数定义为汉字,字符等,全角
数组是连续申请一些内存供应使用
数组的地址是第一个数组的地址
如果我们要存储多人的年龄
能否让编译器分配多一点的int
越界/当你取数组中的数值时,假设数组中有10个值,age[10],值已经越界。
查看-调试-watch-右边输入名称
直接告诉编译器几人几科
二维数组与数组在存储方式上是相同的,不同工作主要是由编译器运作,二维数组就是一维数组
修改的情况下直接修改可以
没有二维数组或者多维数组,本质都是一维数组
表达式是运算符与运算与常量的之间的关系
==%%==使用两个才能显示
加密解密 安全 反病毒 反外挂
位运算能够精确的对某一个位进行操作
无符号数补0,有符号数补符号位 |
如何将二进制数中的某一个位置修改为1? //3位
如何将二进制数中的某一位置修改为0; //3位
//相同为奇数,不同为偶数
赋值是一个动作,表达式是一个数
关系运算符用于比较两者的关系
关系运算符也是双目运算符
表达式1 ? 表达式2 :表达式3
当表达式1为真时 整个表达式的结果为表达式2
当表达式2为真时 整个表达式的结果为表达式3
加在任何表达式的前面,改变表达式的值
人生选择坚持的人,虽然不一定会成功,但是一定无限接近于成功
循环语句的本质是重复执行(重点是终止条件)
有1,2,3,4四个数字,能组成多少互不相同且无重复的三位数?都是多少?
分支语句/无论条件如何,只有一个分支运行,只走一条线
5.不运行程序,说出下面程序执行的结果
表达式x必须是整数类型
如果分支多,效率高//4
if…else语句适合判断区间,而switch不适合
0 | 0 | 0 | 0 |
0 | 0 | 0 |
设置断点F9,取消断点F9
断点只能写在有语句的地方
至少会执行一次,所以,通常用来实现
从键盘上输入字符,并显示,直到输入TAB为止
4.编程将所有“水仙花数”打印出来,并打印其总个数。 “水仙花数”是一个 各个位立方之和等于该整数的三位数
5.验证“角谷猜想”, 判断给定的一个自然数,若为偶数除以 2,若为奇数则乘 3 加 1,得到一个新的自然数后按照上面的法则继续演算,一直到结果变为 1,并且将每一步的运算过程和得到的新的自然数显示出来。
6.百鸡问题:一只公鸡值 5 元,一只母鸡值 3 元,而 1 元可买 3 只小鸡。现有 100 元钱,想买 100 只鸡。问可买公鸡、母鸡、小鸡各几只?
7.编程实现:某人想将手中一张面值 100 元的人民币换成 5 元(可单换 20 张)、1 元(可单
换 100 张)和 0.5 元(可单换 200 张)面值的票子,但要求 100 元换以上的零钱共 100 张,
且要求每种不少于 1 张,共有多少种兑换方法。
8.韩信点兵:韩信才智过人,从不直接清点自己军队的人数,只要让士兵先后以三人一排、
五人一排、七人一排地变换队形,而他每次只掠一眼队伍的排尾就知道总人数了。输入 3
个非负整数 a,b,c,表示每种队形排尾的人数(a
(或报告无解)。已知总人数不小于 10,不超过 100。
9.一辆卡车违反交通规则,撞人后逃逸。现场有三位目击证人,但都没有记住车号,只记下
车号的一些特征。甲说:牌照的前两位数字是相同的。乙说:牌照的后两位数字是相同的,
但是和前两位不同。丙说;四位的车号刚好是一个整数的平方(四位车牌号>999)。请用以上
\10. 有一对兔子,从出生后的第三个月起每个月都生一对兔子。小兔子长到三个月以后每个
月都生一对兔子。小兔子长到第三个月以后每个月又生一对兔子。假设所有的兔子都不死,
问 30 个月内每个月的兔子总数是多少。
11.如果整数 A 的全部因子(包括 1,不包括 A 本身)之和等于 B,且整数 B 的全部因子(包
括 1,不包括 B 本身)之和等于 A。则将 A 和 B 称为亲密数。求 3000 以内的全部亲密数。
函数就是一系列指令的集合,可以完成某一些特定的功能
返回类型 函数名(参数列表)
编写一个函数,能够对任意两个整数实现加法操作,并且返回结果
1.编写一个函数,求两个数的最大公约数并返回。
2.编写一个函数,求一个 int 类型数组所有成员的平均值,并输出数组中最接近平均值的成
3.实现一个函数判断 year 是不是润年,是返回 1,不是返回 0。
4.实现一个函数,判断参数是不是素数,是返回 1,不是返回 0。
5.编写一个函数,可以将字符串 2 合并到字符串 1 中。
6.编写一个函数,打印 x*x 乘法表 x 为参数。
8.编写一个函数,输出 x 以内所有的素数,x 为参数
9.一函数,输入一行字符,将此字符串中最长的单词输出,单词间以空格分隔。
10.定义一个函数,使给定的二维数组(3×3)转置,即行列转换,并输出转换前和转换后的数据。
函数声明有返回类型,必须使return进行返回
函数有返回值,就是一个值
一个函数只能执行一次return
return 可以写多个,但只能执行一次
建议大家定义一个变量r
定义返回结果
数组作为参数传值的时候,是把当前数组的地址,是通过地址进行传递
int类型作为参数传递的时候传递的是值
函数运行时所使用的内存称为栈 |
当程序用完之后依然没有使用栈内存,会报错 |
尽量不要使用,递归非常浪费内存
当你需要一个容器能够存储1个字节,怎么做?//char
当你需要一个容器能够存储4个字节,你会怎么做?//int arr[10]
数组解决不了 成员之间类型不一样的问题
结构体在定义时要字节对齐
比如都是char,会自动扩充至int
结构体的大小未必是整体大小
当数组内的类型不一样时,定义结构体类型
可以,但是要赋值,否则会出现乱码
6.定义一个结构体表示点的 x,y 坐标,依次读入三个正整形坐标值,输出三个点构成的三角形面积
7.在全局定义的结构体和在局部定义的结构体有什么区别?
编写一函数,计算两个日期之间的时间差,并将其值返回。
日期以年、月、日表示。“时间差”以天数表示。注意考虑日期之间的闰年。
函数的输入参数为日期 1 和日期 2,函数的返回值为时间差,单位为天数。
编写一程序,在主函数中输入两个日期,调用上述函数计算两个日期之间的时间差,并将结果输出。
结构体参数为int/char/float/double等基本类型时,传递的是值,是在复制内容
参数为数组类型时,传递的是地址
允许p=p2,结构类型相同
定义结构体包含如下信息:学生姓名,性别,语文数学英语成绩。
设某班有20个学生,请实现以下功能:
1.可以录入学生信息。
2.可以删除学生信息。
3.可以查找学生信息。
1.带有*变量类型的标准写法:变量类型 * 变量名
2.任何类型都可以带 * 加上以后就是新的类型,统称为“指针类型”
指针本质类型的4个字节
运算幅度是类型砍掉一个类型之后的类型宽度
1.不带 * 类型的变量,++ 或者 – 都是加 1或者减1
2.带类型的变量,++或者–新增(减少)的数量是去掉一个后变量的宽度
指针类型的变量宽度永远是4字节
任何一个变量都加 * 变为新的类型
0 |
1(当前内存的编号,代号不需要存储) |
指针: 间接引用运算符 *
变量也有两个属性:地址和值。地址就是变量在计算机内部的名称
许多程序中,地址都归计算机管,对程序员隐藏。然而在C中,可以通过&运算符访问地址,通过*运算符获得地址上的值。
简而言之,普通变量把值作为基本量,把地址作为通过&运算符获得的派生量,而指针变量把地址作为基本量,把值作为通过*运算符获得的派生量。
有时需要把数组设置为只读,这样程序只能从数组中检索值。不能把新值写入数组,要创建只读数组,应该用const声明数组
如果我在程序编译的时候,我并不知道存多少
导致出现一个空白的内存
整个堆空间有一部分用了,有一部分没用,整个内存没有连续,当你申请一个较大内存的时候
4.文件属性:只读、可读可写,隐藏
预处理一般是指在程序源代码被转换为二进制代码之前,由预处理器对程序源代码文本进行处理,处理后的结果再由编译器进一步编译。
预处理功能主要包括宏定义,文件包含,条件编译三部分
以下题目为精选2021届大厂嵌入式笔试题目。
公司一(主要考察C和内存):
2、哪些函数可能造成缓冲区溢出(考察内存,做嵌入式,内存一定要熟悉):
5、字符串数组是否可以比大小
问你12、34、56、78是否相等
前四个是数组名,他们有各自的内存空间。后面四个是指针,他们指向的相等。
(注意:静态初始化数组的语法使用大括号)
2、sizeof 结构体(在结构体中定义变量,考察int,char分配字节数和字节对齐)
3、结构体如何初始化变量
7、strncat函数,找出不合理和出错的地方
8、查找0-100之间的素数
2、双向链表的增删改查,以及逆序输出(双向链表的增删改查是嵌入式必考题,必须熟练)
公司二(主要考察C++和内存):
1、一个类的友元函数可以访问该类的(D)
A私有成员 B保护成员 C公有成员 D所有成员
2、静态变量的作用域:本文件
3、进栈1234,栈的进出不可能的顺序是
6、C++中指针和引用的区别
8、异常的定义,什么时候会抛出异常
9、n个节点的单项链表(没有头节点),最少有几个指针域
11、析构函数中不能做的是:抛出异常
12、关于智能指针使用的一些注意点
15、下列关于动态内存分配,错误的是:(malloc分配是在堆中,静态内存分配是在栈上)
19、C++ 虚拟继承是为了解决数据冗余问题
22、34 不要自己提前算,全部展开再算(考察宏定义的边界问题,经典题目)
考点:static静态变量,只初始化一次
25、8 8 4(考察结构体占用内存)
30、菱形继承时需要加什么关键字,防止内存浪费
33、双向链表代码补全
36、输入几个数,从大到小输出,只输出偶数(冒泡快排都可以)
37、通过C++11模板元编程,实现一个功能判断一个模板参数是否为智能指针
公司三(主要考察C、通信、Linux):
2、关于cache错误的是
3、sizeof 结构体(含位域的)
4、FIQ中断向量入口地址
5、R15还可以作为程序计数器
1、哪些类型可以自加 i++
1、编译优化选项 -o
3、面向对象编程三大特点
1、SPI四种模式,简述其中一种模式,画出时序图
2、判断大小端的三种方式
3、为什么TCP是稳定传输
公司四(主要考察Linux、数据结构、面向对象编程思想、C++):
1、如果要在根目录运行程序,需要把路径设置到下面哪个环境变量中
3、冯‘诺依曼:计算机硬件由运算器、控制器、存储器、输入设备和输出设备五大部分组成。
4、对900,512,613,700,810,采用选择排序,则第三轮排序后结果输出是多少?
5、某一段程序的时间复杂度是多少
7、入栈ABCDE,不可能的出栈顺序是?
9、搜索中“主键”的意思
10、采样频率至少不小于多少才能还原波形
1、构造函数和析构函数的调用参数的顺序
3、java如何类继承
4、java的垃圾回收机制
5、结构体避免编译器优化的关键字
7、python3代码运行结果是?
公司五(主要考察C基础):
1、单片机程序存在哪里:D
3、读写寄存器快还是flash快
4、中断返回地址是谁的地址
6、典型IO口电路有哪三个寄存器(状态、控制、数据)
7、三态门(高电平、低电平、高阻态)
8、内存四区:各种变量存在哪里(堆、栈、data、bss)
版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。