14.volatile 一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。下面是volatile变量的几个例子: (2) 一个中断服务子程序中会访问到的非自动变量(Non-automatic variables)
15.数组和链表的区别 数组:数据顺序存储,固定大小(插入需要移动很多值) 链表:数据可以随机存储,大小可动态改变(访问需要遍历)
16.在嵌入式开发中,为什么能通过C语言去直接操作硬件: 因为有指针,指针是c语言的灵魂,它可以直接访问内存
17.链表的作用 用于内存管理,链表节点中的指针域可以将不连续的内存彼此关联起来,从而实现内存的动态管理。
18.什么变量不能用指针指向? 寄存器变量(register修饰),因为这个变量会优先存放到CPU寄存器中,而指针只能指向内存的任务区域,但不能指向寄存器。
19.头文件中ifndef/define/endif的作用:防止头文件被重复引用
20.#include<filename.h>和#include“filename.h”的区别: <filename.h>告诉预处理器在标准系统目录下寻找文件; “filename.h”告诉预处理器在当前目录中寻找文件,找不到则在标准目录下寻找文件。
21.const有什么用途: (1) 定义const常量 (2)const可以修饰函数的参数、返回值、甚至函数的定义体,被const修饰的东西都受到强制保护,可以预防意外的变动。 //指向长整型的指针变量 const char *p1 = name;//指针所指向的内容不能变,指针指向的地址可变 //指向整形数的长指针 char *const p2 = name;//地址不可变,内容可变 //指向常量的长指针 const char *const name = “chen”;//地址不变,内容不变
22.内存的分配: (1)栈区(stack)--由编译器自动分配释放,存放函数的参数值,局部变量等。其操作方式类似于数据结构中的栈。 (2)堆区(heap)--一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。注意它与数据结构中的堆是两回事,分配方式类似于链表 (3)全局区(静态区)(static)--全局变量和静态变量的存储是放在一起的,初始化的全局变量和静态变量在一起区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后由系统释放 (4)文字常量区--常量字符串就是放在这里,程序结束后由系统释放 (5)程序代码区--存放函数体的二进制代码
23.sizeof和 strlen()的区别 (1)sizeof是运算符,计算数据所占的内存空间,strlen()是一个函数,计算字符数组的字符数。 (2)sizeof可以用类型作参数;strlen()只能用char*作参数,必须是以‘\0’结束。 (3)数组作sizeof参数不退化,传递给strlen就退化为指针了 (4)sizeof操作符的结果类型是size_t,它在头文件typedef为unsigned int类型,该类型保证能容纳实现建立的最大对象的字节大小。
24. 头文件的作用是什么:(1)通过头文件来调用库功能(2)头文件能加强类型安全检查
25. 简述数组和指针的区别:数组要么在静态存储区被创建(全局数组),要么在栈上被创建,指针可以随时指向任意类型的内存块。
26. 变量的定义和声明的区别:声明变量不分配空间,定义变量分配空间。声明告诉编译器后面的引用都按声明的格式。定义其实包含了声明的意思,同时要分配内存空间。
27. 简述什么是值传递,什么是地址传递 值传递主调函数传递给被调函数的是值拷贝,不是原值;地址传递主调函数传递给被调函数的值的地址。区别是值传递被调函数中的操作不改变主调函数的值,而地址传递则不同。
28.结构体和共用体的区别: (1)结构体和共用体都是由多个不同数据类型成员组成,但在任何同一时刻,共用体只存放了一个被选中的成员(所有成员共用一块地址空间),而结构体的所有成员都存在(不同成员的存放地址不同) (2)对于共用体的不同成员赋值,将会对其他成员重写,原来的值就不存在了,而结构体的不同成员赋值是互不影响的。
|