这里写目录标题
- 一级目录
- 1.变量/函数的声明和定义之间有什么区别
- 2.C中有哪些不同的存储类说明符?
- 3.变量的范围是什么?变量在C中的作用域怎样?
- 4.没有分号,您将如何打印“ Hello World”?
- 5.什么时候应该在C程序中使用指针?
- 6.什么是NULL指针?
- 7.什么是悬空指针?
- 8.什么是内存泄漏?为何应避免使用它
- 9.什么是局部静态变量?它们有什么用?
- 10.什么是静态函数?它们有什么用?
- 11、局部变量能否和全局变量重名?
- 12、如何引用一个已经定义过的全局变量?
- 13、全局变量可不可以定义在可被多个.C文件包含的头文件中?为什么?
- 14、static全局变量与普通的全局变量有什么区别?static局部变量和普通局部变量有什么区别?static函数与普通函数有什么区别?
- 15、程序的局部变量存在于(堆栈)中,全局变量存在于(静态区 )中,动态申请数据存在于( 堆)中
- 16.对于一个频繁使用的短小函数,在C语言中应用什么实现,在C++中应用什么实现?
- 17.Heap与stack的差别。
- 18.Template有什么特点?什么时候用?
- 19 什么是预编译,何时需要预编译:
- 20、关键字static的作用是什么?
- 21、关键字const有什么含意?
- 22、关键字volatile有什么含意?并举出三个不同的例子?
一级目录
二级目录
三级目录
1.变量/函数的声明和定义之间有什么区别
答案:变量/函数的声明仅声明变量/函数存在于程序中的某个位置,但未为其分配内存。但是变量/函数的声明起着重要的作用。这就是变量/函数的类型。因此,在声明变量时,程序会知道该变量的数据类型。在声明函数的情况下,程序会知道该函数的参数是什么,它们的数据类型,参数的顺序以及函数的返回类型。这就是声明。关于定义,当我们定义变量/函数时,除了声明的作用外,它还为该变量/函数分配内存。因此,我们可以将定义视为声明的超集。(或声明作为定义的子集)。
2.C中有哪些不同的存储类说明符?
答案:auto, register, static, extern
3.变量的范围是什么?变量在C中的作用域怎样?
答案:变量的范围是程序的一部分,可以直接访问该变量。在C语言中,所有标识符都在词法(或静态)范围内。
4.没有分号,您将如何打印“ Hello World”?
#include<stdio.h> intmain(void){ if (printf(“Hello World”)) { } }
5.什么时候应该在C程序中使用指针?
答案:
1.获取变量的地址2.为了在C中实现引用传递:指针允许不同的函数共享和修改其局部变量。3.通过大型结构,以便避免完整复制结构。4.实现“链接”数据结构,例如链接列表和二进制树。
6.什么是NULL指针?
答案:NULL用于指示指针未指向有效位置。理想情况下,如果在声明时不知道指针的值,则应将指针初始化为NULL。另外,当由它指向的内存在程序中间被释放时,我们应该使指针为NULL。
7.什么是悬空指针?
答案:悬空指针是没有指向有效内存位置的指针。当删除或释放对象时,如果不修改指针的值,就会出现悬空指针,因此指针仍然指向释放后的内存的存储位置。以下是示例。
// 示例1int* ptr = (int*)malloc(sizeof(int)); …free(ptr); // ptr 是一个悬空指针,以下操作无效ptr = 10;// 示例2int ptr = NULL{ int x = 10; ptr = &x; } //x超出范围,并且分配给x的内存现在可用//所以ptr现在是悬空指针
8.什么是内存泄漏?为何应避免使用它
答案:程序员在堆中创建内存而忘记删除它时,就会发生内存泄漏。对于诸如守护程序和服务器之类的程序而言,内存泄漏是特别严重的问题,根据定义它们永远不会终止。
9.什么是局部静态变量?它们有什么用?
答案:局部静态变量是一个变量,其生存期并不以声明它的函数调用结尾。它延长了整个程序的寿命。所有对该函数的调用都共享局部静态变量的相同副本。静态变量可用于计算调用函数的次数。另外,静态变量的默认值为0。例如,以下程序输出“ 0 1”
#include <stdio.h> void fun(){ // 静态变量的默认值为0 static int x; printf("%d ", x); x = x + 1; } int main() { fun(); fun(); return0; } // 输出: 0 1
10.什么是静态函数?它们有什么用?
答案:在C语言中,默认情况下函数是全局的。函数名称前的“ static”关键字使其变为静态。与C中的全局函数不同,对静态函数的访问仅限于声明它们的文件。因此,当我们想限制对函数的访问时,我们将它们设为静态。使函数成为静态的另一个原因可能是在其他文件中重用了相同的函数名
11、局部变量能否和全局变量重名?
答:能,局部会屏蔽全局。要用全局变量,需要使用"::" ;局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。对于有些编译器而言,在同一个函数内可以定义多个同名的局部变量,比如在两个循环体内都定义一个同名的局部变量,而那个局部变量的作用域就在那个循环体内。
12、如何引用一个已经定义过的全局变量?
答:extern 可以用引用头文件的方式,也可以用extern关键字,如果用引用头文件方式来引用某个在头文件中声明的全局变理,假定你将那个编写错了,那么在编译期间会报错,如果你用extern方式引用时,假定你犯了同样的错误,那么在编译期间不会报错,而在连接期间报错。
13、全局变量可不可以定义在可被多个.C文件包含的头文件中?为什么?
答:可以,在不同的C文件中以static形式来声明同名全局变量。 可以在不同的C文件中声明同名的全局变量,前提是其中只能有一个C文件中对此变量赋初值,此时连接不会出错.
14、static全局变量与普通的全局变量有什么区别?static局部变量和普通局部变量有什么区别?static函数与普通函数有什么区别?
答:
- 全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。 这两者在存储方式上并无不同。这两者的区别在于非静态全局变量的作用域是整个源程序, 当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。
而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用, 因此可以避免在其它源文件中引起错误。 - 从以上分析可以看出, 把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域,限制了它的使用范围。
- static函数与普通函数作用域不同,仅在本文件。只在当前源文件中使用的函数应该说明为内部函数(static),内部函数应该在当前源文件中说明和定义。对于可在当前源文件以外使用的函数,应该在一个头文件中说明,要使用这些函数的源文件要包含这个头文件
综上所述:
static全局变量与普通的全局变量有什么区别:
static全局变量只初使化一次,防止在其他文件单元中被引用;
static局部变量和普通局部变量有什么区别:
static局部变量只被初始化一次,下一次依据上一次结果值;
static函数与普通函数有什么区别:
static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝
15、程序的局部变量存在于(堆栈)中,全局变量存在于(静态区 )中,动态申请数据存在于( 堆)中
16.对于一个频繁使用的短小函数,在C语言中应用什么实现,在C++中应用什么实现?
c用宏定义,c++用inline
17.Heap与stack的差别。
答:Heap是堆,stack是栈。
Stack的空间由操作系统自动分配/释放,Heap上的空间手动分配/释放。
Stack空间有限,Heap是很大的自由存储区
C中的malloc函数分配的内存空间即在堆上,C++中对应的是new操作符。
程序在编译期对变量和函数分配内存都在栈上进行,且程序运行过程中函数调用时参数的传递也在栈上进行
18.Template有什么特点?什么时候用?
答: Template可以独立于任何特定的类型编写代码,是泛型编程的基础.
当我们编写的类和函数能够多态的用于跨越编译时不相关的类型时,用Template.
模板主要用于STL中的容器,算法,迭代器等以及模板元编程.
(C++的template是实现在库设计和嵌入式设计中的关键。
template能实现抽象和效率的结合;同时template还能有效地防止代码膨胀)
19 什么是预编译,何时需要预编译:
答: 就是指程序执行前的一些预处理工作,主要指#表示的.
何时需要预编译?
1)、总是使用不经常改动的大型代码体。
2)、程序由多个模块组成,所有模块都使用一组标准的包含文件和相同的编译选项。在这种情况下,可以将所有包含文件预编译为一个预编译头。
20、关键字static的作用是什么?
答:1)定义静态局部变量,作用域从函数开始到结束.
2) 在模块内的static函数只可被这一模块内的其它函数调用,这个函数的使用范围被限制在声明它的模块内;
3) 在类中的static成员变量属于整个类所拥有,对类的所有对象只有一份拷贝
21、关键字const有什么含意?
答 :1)表示常量不可以修改的变量。
2)可以修饰参数,作为输入参数.
3)修饰函数,防止以外的改动.
4)修饰类的成员函数,不改变类中的数据成员.
22、关键字volatile有什么含意?并举出三个不同的例子?
答: 提示编译器对象的值可能在编译器未监测到的情况下改变。
例子: 硬件时钟;多线程中被多个任务共享的变量等