嵌入式C语言编程在笔试中占有重要地位,尤其是在面试过程中对程序员的技能和理论知识进行考察。本笔记主要涵盖了内存管理、指针概念、数组与指针的区别、函数指针以及基础的数据类型和运算理解。
1. **内存泄漏**:
- 内存泄漏通常分为两种类型:一种是动态分配的内存未释放,如在C/C++中,使用`malloc()`或`new`申请的内存,若忘记通过`free()`或`delete`将其释放,会导致内存占用持续增加。另一种是通过引用保留不再需要的内存,即使对象已无实际使用但仍保留其地址。
2. **指针和数组**:
- 左值(变量内存地址)和右值(存储的值)在某些情况下看似相同,但实际上是不同的概念。例如,`a`、`&a`和`a[0]`在数值上看相似,但含义不同:`a`代表变量本身,`&a`是其地址,`a[0]`是数组的第一个元素的地址。
- 指针数组如`int*p[5]`和数组指针`int(*p)[5]`有不同的类型,前者是整型指针数组,后者是数组指针,可以指向一维整型数组。
- `a+1`在指针上下文中表示指针向后移动一个整型的大小,而在数组上下文中可能意味着访问下一个元素。
3. **函数指针**:
- `void(*fptr)()`定义了一个函数指针,它可以指向任何返回void的函数,常用于返回数组元素地址。
- `void*fptr()`则是指针函数的指针,用来存储函数地址,便于间接调用。
4. **参数传递**:
- 传值调用中,实参的副本被传递到函数,不会改变实参本身。如`swap(intx, inty)`。
- 传址调用(通过指针传递)则可以直接修改实参,如`swap(int*x, int*y)`,其中`*x`和`*y`是实参的地址。
5. **内存算术操作**:
- 如`int*ptr=(int*)&(a+1)`,这里`a+1`表示a的下一个整型地址,`(int*)&`强制类型转换,`ptr`指向`a[5]`地址。
- `ptr-1`计算后指向`a[4]`,`*(ptr-1)`获取`a[4]`的值。
6. **数值表示**:
- 提到了反码、补码和原码的概念,这是计算机存储和处理二进制数据的基础,理解这些概念有助于正确处理各种数值运算。
掌握以上知识点对于理解和解决嵌入式C语言编程中的内存管理、数据结构操作以及函数指针等问题至关重要,对于准备嵌入式开发领域的笔试面试非常有帮助。