C语言面试常见问题

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声明,需要使用时就包含该头文件。

7do…whilewhile…do的区别

1) do…while无论条件是否成立,都会先执行循环语句,即至少执行一次

2) while…do则是先判断执行条件,成立后在执行循环体,可能一次也不执行

8gcc编译的过程

主要分为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)

11static作用于全局变量、局部变量、函数后与普通的区别。

全局变量前加上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)引用是变量的别名,一般用来作为函数的参数或者函数的返回值,不需要分配内存空间。引用访问一个变量是直接访问。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值