1、如何在不开辟新的内存空间的情况下,交换两个变量的值。
可以使用加减法,例如:按此步骤(1)a=a+b (2)b=a-b (3)a=a-b
在这里不开辟新的变量,就不会开辟新的内存空间
2、全局变量和局部变量在内存中的区别
(1) 生命周期
全局变量:要在程序运行结束后才会撤销,内存才会释放
局部变量:只在其所在函数的执行期间存在,函数调用了一次后,局部变量就会撤销,所占内存空间也会被释放。
(2) 作用范围
全局变量:全局作用域,只需要在一个源文件中定义,就可以作用于所有源文件
局部变量:只在它所在的函数或者循环内起作用
(3) 内存中的位置
全局变量:存在于内存中的全局区(静态区)
局部变量:内存中的栈区
3、队列和栈的区别
队列:先进先出,rear进队,front出队
栈:先进先出,只有一个口供出入
4、局部变量和全局变量重名的影响
1) 在局部变量定义的函数中,局部变量会屏蔽全局变量,以局部变量为主
2) 在局部变量定义的函数外,变量值以全局变量为主
5、如何在其他文件中引用一个已经定义过的全局变量
(1) 引用头文件的方式
可以在不同的C文件中声明同名的全局变量,前提是其中只能有一个C文件对此变量赋处置,此时的连接不会出错。
(2) 关键字
使用extern关键字
6、全局变量可定义在头文件中,供多个C语言文件使用,但不建议
1) 引用该变量的文件要先用extern声明。
2)但这样做,当该头文件被多个C文件包含时,都会对该变量定义一次,会导致重复定义。
3) 建议在一个特定的C文件中定义,然后在特定的头文件中使用extern声明,需要使用时就包含该头文件。
7、do…while和while…do的区别
1) do…while无论条件是否成立,都会先执行循环语句,即至少执行一次
2) while…do则是先判断执行条件,成立后在执行循环体,可能一次也不执行
8、gcc编译的过程
主要分为4个阶段:预处理、编译、汇编、链接
(1) 预处理:
1) 头文件展开:几行的hello.c变成上千行的hello.i
2) 宏定义替换:宏名替换为宏值
3) 删除注释:注释只是给人看的
4) 条件编译:可避免头文件被重复包含
(2) 编译
hello.i编译得到汇编文件(.s)hello.s
(汇编指令是最接近于机器语言的语言)
(3)汇编
hello.s执行汇编操作生成目标文件(.o)hello.o
(汇编指令被翻译成了二进制的及其指令)
(4)链接
Hello.o经过链接得到hello.exe(可执行文件)
9、各变量类型所占的字节
可以先区分下操作系统和编译器软件位数上的区别
1) 操作系统上的位数区别:
32位操作系统一次最多处理32位的数据;寻址空间有2^32,也就是最多可以有4G的内存。
64位操作系统一次最多处理64位的数据;寻址空间有2^64,最多可以支持128G的内存。64位操作系统意味着其cpu拥有更大的寻址能力。但这也需要在64位操作系统上运行的软件也是64位的。
2)编译器
软件中数据类型的字节数大小与操作系统多少位却并没有关系,而是由编译器决定的。数据结构占多少位取决于在软件编译时选择的是64位还是32位,其具体占位数编译器已经决定了,可见下表。
不同类型所占字节数:
类型 | 32位编译器 | 64位编译器 |
char | 1 | 1 |
int | 4 | 4 |
float | 4 | 4 |
double | 8 | 8 |
Short int | 2 | 2 |
long int | 4 | 8 |
long long int | 8 | 8 |
char * | 4 | 8 |
char*(即指针变量): 4个字节,占32位。
10、对数组的使用
(1)数组名
数组名作为类型时,代表的是整个数组的大小
数组名作为地址时,代表的是数组首元素的地址
对数组名取地址时,代表的是数组的首地址
(2)具体使用
例:int arr[5] = {1, 2, 3, 4, 5};
1) 赋值:int arr[5] = {1, 2, 3};此时:arr数组的值为{1,2,3,0,0}
2) 获取首元素地址:arr、&arr [0]、(arr+0)
3) 获取数组地址:&arr
4) 获取数组其余元素地址:arr+n
5) 获取数组其余元素值:arr[n]、*(arr+1)
11、static作用于全局变量、局部变量、函数后与普通的区别。
全局变量前加上static后就变成了静态的全局变量
1) 非静态全局变量作用域为整个源程序,当源程序由多个源文件组成时,非静态全局变量在各个源文件中都有效。
2) 静态全局变量则是被限制了作用域,只在定义该变量的源文件中有效
12、程序内存分配的存储段
可执行程序主要分为以下三部分
(1) 数据段
存放已初始化的全局变量和静态变量,属于静态内存分配
(2) 代码段
用于存放程序的代码内存空间,大小在程序运行前就已经确定。该区域只能读不能些,在代码段中可能也包含了一些只读的常熟变量,例如字符串常量等。
(3) BSS段(Block Started by Symbol)
存放未初始化的全局变量和静态变量。该区域可读写,由链接器从可执行文件中得到BSS段的大小,然后申请得到这块内存,该内存跟在数据段后面,并不占用可执行文件的大小。属于静态内存分配。
13、内存分配方式及区别
(1) 静态存储区分配内存
如全局变量和静态变量,内存在程序编译时已分配好,并在程序运行期间一直存在。
(2) 栈区分配内存
执行函数时,函数内部的局部变量的存储单元在栈上创建,函数结束时,这些内存就会被自动释放。
(3) 堆区分配内存
也称动态分配内存。程序运行时用malloc函数申请任意大小的内存,不用时由free释放。
14、数组与指针的区别
数组:
1) 可存储连续多个相同类型的数据
2) 只能一个一个的单个元素赋值,或者整个数组赋值
3) 连续存储空间
4) 作为参数时,数组名自动退化成同类型的指针
指针:
1) 指针变量名,存储的是地址,加上地址符可访问存储的地址中的变量值
2) 对指针变量赋值时,可以使存储地址不变,只改变存储的数据值
15、“引用”与指针的区别
(1)指针本身是一个地址,需要分配内存空间,使用指针访问一个变量是间接访问。
(2)引用是变量的别名,一般用来作为函数的参数或者函数的返回值,不需要分配内存空间。引用访问一个变量是直接访问。