嵌入式八股文记录

1、指针函数和函数指针

函数指针:指向一个函数的指针

指针函数:一个函数的返回值是一个指针的函数

2、指针的大小

char* int* float*

指针的大小和编译器的位数有关,在32bit(x86)的系统下指针的大小是4个字节,在64bit(x64)的系统下指针是8个字节

指针的大小是固定的和指针的类型没有关系

3、sizeof和strlen的区别

        sizeof:运算符,关键字。计算数据类型/变量所占存储空间的大小(字节数)。

        strlen:函数。计算字符串长度。

        (1)sizeof是一个运算符,strlen是一个函数,包含string.h

        (2)sizeof计算的是所占内存的大小(/0需要计算),strlen计算的是字符串的长度(字符串以/0结尾,/0是不需要计算长度的)

        (3)strlen一般用于字符串的长度,sizeof可以计算int float类型的大小

        (4)计算时间:sizeof在编译期,strlen在运行期

4、c语言内存分配的方式

(1)静态存储器分配,例如全局变量,静态变量

(2)栈上分配(函数中定义出的局部变量)

(3)堆上分配(malloc,new)

5、数组指针和指针数组

(1)数组指针:指的是指向数组的指针,本质是一个指针

int (*p)[10];//数组指针的声明

(2)指针数组:本质是一个数组,里面的每一个元素都是指针

int* a,a1,a2;
int* p1[10]={a,a1,a2};//指针数值

6、struct结构体和union联合体区别

union 联合体:所有成员共享一块地址。

                        大小计算:共用体大小 = 成员中占内存最大的成员的大小。

struct 结构体:不同的成员放在不同的地址中。

                        大小计算:结构体大小 = 所有成员大小之和(字节对齐)。

7、野指针

野指针:指向不可用内存的指针

为什么会导致野指针:

        (1)当指针被创建的时候,没有赋值这个时候指针就成为了野指针

char* p;

        (2)当指针被free或delete后,如果没有把指针赋值为NULL,这个时候指针也是野指针

#include <malloc.h>
char* p1 = malloc(10);
free(pl);

        (3)当指针越界的时候也是野指针(经常出现在数组里面)

8、数组和链表的区别

        (1)数组的地址空间是连续的,链表的地址空间是不连续的

        (2)数组的访问速度比较快,数组直接通过下标访问,访问链表的时候需要遍历链表

        (3)链表增删查改的速度比数组快

9、宏函数注意点

写一个宏,这个宏返回输入参数比较小的一个

#define MIN(a,b) ((a)<=(b) ? (a):(b))//每个参数都要加一个括号

10、#include<>和#include""的区别

(1)#include<>:编译器会从标准库的路径里面去搜索,对于搜索标准库的文件速度会比较快

(2)#include"":编译器会从用户的工作路径里面去搜索,对于自己定义的文件使用“”的速度会比较快

11、全局变量和局部变量的区别

(1)作用域:全局变量的作用域为程序块,局部变量的作用域是当前函数内部

(2)生命周期:全局变量的生命周期是整个程序,局部变量的生命周期是当前的函数

(3)存储方式:局部变量存储在栈里面的,全局变量存储在全局数据区中

(4)使用方式:全局变量在程序的各个部分都可以使用到,局部变量只能在函数的内部区使用

12、#define和typedef的区别

(1)define是一个预处理指令,typedef是关键字

(2)define不会做正确性检查,直接进行替换,typedef会做正确性检查

(3)define没有作用域的限制,typedef是有作用域的限制

(4)对指针的操作不同,一般使用typedef对指针进行重命名

13、static的作用

用来定义一个静态变量或者是静态函数

(1)在函数体中使用static去定义变量,那么这个变量只会被初始化一次

void fun(void)
{
    static int a=0;//只会被执行一次
    a++;
}

(2)定义的静态函数或者是静态变量只能在当前文件中使用(作用域的限制)

(3)在函数内部定义的静态变量无法被其他函数使用

14、内存泄漏

内存泄漏指的是在程序运行的时候,动态分配的空间没有被回收或者是正确释放,导致了这个内存空间仍然占据着系统的资源

15、内存对齐

内存对齐是在存储数据时,将数据按照一定的规则放置在内存中的过程

typedef struct
{
    char a;//1
    short c;//2
    int d;//4
    double b;//8
}STU;

以最大的变量所占据的内存来进行分配内存空间

16、数组名和指针的区别

 (1)数组名就是数组首元素的地址,也可以看作一个常量指针,这个指针是不能修改指向的,内存访问为4个字节

(2)使用指针访问数组的时候需要使用到解引用使用*,使用指针访问数组是间接访问,使用数组名访问数组是直接访问

(3)使用sizeof对指针和数组名进行计算的时候也是不同的,指针的大小和编译器的位数有关,使用sizeof计算数组名是整个数组的大小

17、指针常量和常量指针

常量指针:指向一个常量的指针,这个指针无法修改所指向的数据,但是可以修改指向

int a =5;
int b =6;

const int *p = &a;
p=&b;

指针常量:指针是一个常量,指针所指向的地址是固定的,但是可以修改地址中的值

int* const pl = &a;
*pl = 5;

18、堆和栈的区别

(1)创建方式不同:

        栈是系统自动创建(栈主要用于保存局部变量),当函数执行完成,栈被销毁

        堆是程序员手动进行创建和释放的,malloc进行创建,free进行释放

(2)空间大小的区别:

        栈的空间是比较小的

        堆的空间是比较大的

(3)访问速度:

        栈的访问速度是比堆要快的

(4)生命周期

        栈当使用完成后就会自动被销毁

        堆是要靠程序员自己进行手动销毁

19、malloc和new的区别

(1)malloc是C语言中的标准库函数,new是C++中的操作符

(2)malloc分配内存后返回的是void*类型的指针,new分配内存后返回的是对应对象类型的指针

(3)使用malloc分配内存的时候需要进行指定内存的大小,使用new进行内存分配时不需要指定

(4)使用malloc分配内存的时候不会调用到构造函数,使用new分配内存时会调用到构造函数

20、struct和class在C++中的区别

(1)struct成员默认是共有的,class默认的成员是私有的

(2)继承方面:struct默认的是共有继承,class默认的是私有继承

(3)使用场景:struct一般是用于做简单的数据结构(在c语言中一般是类型重命名),class一般用于封装和继承

21、C++中的类有几个访问权限

在C++中分别有三个访问权限:共有的、私有的、受保护的

        &#x

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值