面试了,把提到的问题记录一下,顺带整理下答案。
预处理(宏定义、文件包含、条件编译)
#define预编译
条件编译
#ifndef
#define
#endif
宏定义判断,防止多重定义
const关键字:
修饰变量变量的值不能改变
const和指针:
限制指针变量本身,限制指针指向的数据
由const和指针变量的位置决定
const int *p1;p1指针本身可以修改,指向的数据不能改
int const *p2;p2指针本身可以修改,指向的数据不能改
int * const p3;p3指针是只读的
const和形参:
防止在函数内部修改指针指向的数据
static关键字(修饰函数、局部变量、全局变量):
static修饰函数:限制作用域
内部函数,隐藏
static局部变量:
静态变量后是改变了它的存储方式,静态储存方式,永久性,默认初始化为0
static全局变量:限制作用域
全局变量的静态全局变量都是静态储存方式,非静态全局变量的作用域是整个源程序,静态全局变量只在定义该变量的源文件中有效
static修饰函数和修饰变量的区别:
数据类型:
char:1字节 -127~128/0-255
int:4字节 -2,147,483,648 到 2,147,483,647
short:2字节 -32,768 到 32,767
----------------------无--------------------------
并没有这种数据类型
byte:字节->8位二进制
word:字->16位二进制
指针:
指针是一个变量,其值为另一个变量的地址
使用连字号(&)运算符访问的地址,它表示了在内存中的一个地址
int ba =20; int * a;//首先声明指针变量类型 a=&ba;//在指针变量中储存ba的地址数组:
用来存储一系列数据,往往被认为是一系列相同类型的变量。
数组指针:
指针数组是一种特殊的数组,指针数组的数组元素都是指针变量。指针数组的定义格式为: 类型名称 *数组名称[数组长度];
balance 是一个指向 &balance[0] 的指针,即数组 balance 的第一个元素的地址。把 p 赋值为 balance 的第一个元素的地址:
double *p; double balance[10]; p = balance;储存类:
存储类定义 C 程序中变量/函数的范围(可见性)和生命周期
局部变量默认auto
register 存储类用于定义存储在寄存器中而不是 RAM 中的局部变量(不能用&)
static 存储类指示编译器在程序的生命周期内保持局部变量的存在
extern 存储类用于提供一个全局变量的引用,全局变量对所有的程序文件都是可见的
动态内存
void *calloc(int num, int size); 在内存中动态地分配 num 个长度为 size 的连续空间,并将每一个字节都初始化为 0。所以它的结果是分配了 num*size 个字节长度的内存空间,并且每个字节的值都是0。
void free(void *address); 该函数释放 address 所指向的内存块,释放的是动态分配的内存空间。
void *malloc(int num); 在堆区分配一块指定大小的内存空间,用来存放数据。这块内存空间在函数执行完成后不会被初始化,它们的值是未知的。
void *realloc(void *address, int newsize); 该函数重新分配内存,把内存扩展到 newsize。
链表:
单链表、双链表、循环链表
安卓使用的库是什么?
安卓支持库、组件库(不一定正确)
生命名周期:
onCreate、onStart、onResume、onPause、onStop、onDestroy、onRestart
I2C:
总线型,主从。SDA和SCL两根线。
根据通信规则发送数据。
SCL 线是高电平时,SDA 线从高电平向低电平切换表示起始条件;当SCL 是高电平时SDA 线由低电平向高电平切换表示停止条件。数据传输时,SDA 线上的数据必须在时钟的高电平周期保持稳定。数据线的高或低电平状态只有在SCL 线的时钟信号是低电平时才能改变。
发送到SDA 线上的每个字节必须为8 位。
可以由高位到低位传输多个字节。每个字节后必须跟一个响应位(ACK)。响应时钟脉冲由主机产生。主机释放SDA 线从机将SDA 线拉低,并在时钟脉冲的高电平期间保持稳定。当主机接受数据时,它收到最后一个数据字节后,必须向从机发出一个结束传送的信号。这个信号是由主机对从机的“非应答”来实现的。然后,从机释放SDA 线,以允许主机产生终止或重复起始信号。
GPIO:
使能GPIO外设时钟设置端口模式、速度 模拟输入模式/浮空输入模式/上拉/下拉输入模式/通用推挽输出模式/通用开漏输出模式/复用功能推挽输出模式/复用功能开漏输出模式设置端口