1.变量声明和定义的区别
- 声明是用来告诉编译器变量的名称和类型,而不分配内存。
- 定义用于为变量分配存储空间,还可以为变量指定初始值。
- 通常变量的定义和声明是同时发生的,注意:extern 变量类型 变量名 仅是声明。
- 一个变量可以在多个地方声明,但是只能在一个地方定义;
- 很多时候一个变量只是声明不分配内存空间,直到具体使用时才初始化,分配内存空间,如外部变量;
- 注意:不应该在头文件中定义变量,因为一个头文件可能会被一个程序的许多源文件所包含。全局变量或静态变量初始值为0,局部变量初始化为随机值。
2.全局变量和局部变量能够重名吗
能,局部会屏蔽全局。要用全局变量,需要使用"::"
局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。对于有些编译器而言,在同一个函数内可以定义多个同名的局部变量,比如在两个循环体内都定义一个同名的局部变量,而那个局部变量的作用域就在那个循环体内。
3.staic修饰函数、全局变量和局部变量的区别
- 把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。
- 把全局变量改变为静态变量后是改变了它的作用域,限制了它的使用范围。
- static函数作用域仅在本文件;应该在当前源文件中说明和定义;static函数在内存中只有一份。
4.指针常量和常量指针的区别
- 指针常量——指针类型的常量(int *const p)
本质上一个常量,指针用来说明常量的类型,表示该常量是一个指针类型的常量。在指针常量中,指针自身的值是一个常量,不可改变,始终指向同一个地址。在定义的同时必须初始化。 - 常量指针——指向“常量”的指针(const int *p, int const *p)
常量指针本质上是一个指针,常量表示指针指向的内容,说明该指针指向一个“常量”。在常量指针中,指针指向的内容是不可改变的,指针看起来好像指向了一个常量。
5.指针在操作系统中占几个字节(32OS、64OS)
- 一个指针在32位的计算机上,占4个字节;
- 一个指针在64位的计算机上,占8个字节。
6.break和continue的区别
- 用break语句可以使流程跳出switch语句体,也可以用break语句在循环结构终止本层循环体,从而提前结束本层循环。
- continue语句的作用是跳过本次循环体中余下尚未执行的语句,立即进行下一次的循环条件判定,可以理解为仅结束本次循环。
7.sizeof和strlen的区别
- sizeof操作符的结果类型为size_t,计算的是分配空间的实际字节数。
- strlen结果类型也为size_t,但strlen是计算的空间中字符的个数(不包括‘\0’)。
- sizeof是运算符,可以以类型、函数、做参数 。strlen是函数,只能以char*(字符串)做参数。而且,要想得到的结果正确必须包含 ‘\0’(通过strlen的实现得知)。
- sizeof是在编译的时候就将结果计算出来了是类型所占空间的字节数,所以以数组名做参数时计算的是整个数组的大小。而strlen是在运行的时候才开始计算结果,这是计算的结果不再是类型所占内存的大小,数组名就退化为指针了。
8.struct字节对齐问题
对齐规则:
- 结构体变量的首地址能够被其对齐字节数的大小所整除
- 结构体每个成员相对结构体首地址的偏移都是成员大小的整数倍,如不满足,对前一个成员填充字节以满足
- 结构体的总大小为结构体对最大成员大小的整数倍,如不满足,最后填充字节以满足
举例:同样内容的结构体,B则只需要12个字节对齐
struct A {
int a;
char b;
int c;
short d;
}
struct B {
int a;
char b;
short d;
int c;
}
9.enum所占的字节数
- 枚举变量的大小,实质是常数所占内存空间的大小(常数为int类型,当前主流的编译器中一般是32位机器和64位机器中int型都是4个字节)
10.内存四区
-
代码区:存放函数体内的二进制代码,有操作系统管理。
-
全局区:存放全局变量,静态变量以及常量。
-
栈区:由编译器自动分配和释放,存放函数参数,局部变量等
-
堆区:由程序员分配释放,若程序员未释放,则程序结束之后,编译器自动释放。