1.float的默认精度为小数点后6位。
2.
char str[] = “Hello” ; sizeof(str)=6;
char *p = str ; sizeof(str)=4;
void * p = malloc( 100 ); sizeof(p)=4;
- 结构体与union的大小计算。
- 结构体采用字节对齐方式。即结构体成员中占内存最多的数据类型所占的字节数为标准,所有的成员在分配内存时都要与这个长度对齐。
- union采用最大的元素的长度。
typedef union {
long i;
int k[5];
char c;
}DATE;
sizeof(DATE);//24
long 占8个字节,int k[5]占 20个字节,char c 占1个字节。union大小为20。
struct STUDENT
{
char a;
int b;
}data;
sizeof(data)//8
按下图进行字节对齐:
typedef union {
long i;
int k[5];
char c;
}DATE;//size=24
struct name1
{
int a;
DATE b;
double c;
}name1;
sizeof(name1);//40
以结构体中占内存最多的double 8作为标准,DATA 为24占三行,double int 各占一行,所以为5*8=40。
-
指针变量定义时,需要初始化。
-
volatile关键字的作用:用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。
使用场景:
1). 并行设备的硬件寄存器(如:状态寄存器)
2). 一个中断服务子程序中会访问到的非自动变量
3). 多线程应用中被几个任务共享的变量 -
头文件中 ifndef/define/endif 的作用:防止该头文件被重复引用。
-
#include <filename.h> 和#include “filename.h” 有什么区别?
对于#include <filename.h> ,编译器从标准库路径开始搜索filename.h ;
对于#include “filename.h” ,编译器从用户的工作路径开始搜索filename.h 。 -
const 关键字(重要)
- const 修饰常量:定义时被初始化,不可以被修改。
- const 修饰形参:形参在函数里,不可以修改。
- const 修饰类成员函数:函数对成员变量只能进行只读操作。
- static 关键字 (重要)
- static 修饰局部变量: 设置变量的存储域,存储在静态数据区,函数执行完成后,不会被释放,保留在内存中。
- static 修饰全局变量:限制变量的作用域,只在本文件内部有效。
- static 修饰函数:影响函数的连接方式,使得函数在本文件内部有效,不用担心与其他文件中的同名函数相冲突。
static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝。
- 如何引用一个已经定义过的全局变量?
- 引用头文件方式。
- 使用extern关键字。
- 宏定义写swap(x,y)函数:
#define SWAP(x, y)
(x)=(x)+(y);
(y)=(x)–(y);
(x)=(x)–(y)
- 宏定义写MAX(x,y)函数:
#define MAX(a,b) (a>b)?a:b
- 带参宏和带参函数的区别:
类别 | 带参宏 | 带参函数 |
---|---|---|
处理时间 | 编译时 | 运行时 |
参数类型 | 无 | 需定义 |
程序长度 | 变长 | 不变 |
占用存储空间 | 否 | 是 |
运行时间 | 不占运行时间 | 调用和返回时占 |
- A.c 和B.c两个c文件中使用了两个相同名字的static变量,编译的时候会不会有问题?这两个static变量会保存到哪里(栈还是堆或者其他的)?
static修饰全局变量,只在本文件内有效。表明这个变量仅在本模块中有意义,不会影响其他模块。他们都放在静态数据区,但是编译器对他们的命名是不同的。