简答题2

1. 简述数组与指针的区别

1.数组是开辟一块连续的内存空间,数组本身的标示符代表整个数组,可以用sizeof取得真实的大小;指针则是只分配一个指针大小的内存,并把它的值指向某个有效的内存空间

2.数组或是在静态存储区被创建(全局数组),或是在栈上被创建。数组名对应着,注意不是指向,一块内存,其地址与容量在生命期内保持不变(当然,使用了realloc()的不算),只有数组的内容可以改变。
指针可以随时指向任意类型的内存块,它的特征是“可变”,所以我们常用指针来操作动态内存。

3.当数组作为函数的参数进行传递时,数组就自动退化为同类型的指针。
典型的情况是

void func(intA[])
{

//sizeof(A)得到的是4bytes

}

int main()
{

inta[10];//sizeof(a)得到的结果是40bytes
funct(a);
}


 

2. 关键字const是什么含义,有什么作用?

const  constant 也就是常量的意思

 

const关键字至少有下列n个作用:

1)欲阻止一个变量被改变,可以使用const关键字。在定义该const变量时,通常需要对它进行初始化,因为以后就没有机会再去改变它了只是不能通过变量本身去改变它的值了
2)对指针来说,可以指定指针本身为const,也可以指定指针所指的数据为const,或二者同时指定为const
3)在一个函数声明中,const可以修饰形参,表明它是一个输入参数,在函数内部不能改变其值;
4)对于类的成员函数,若指定其为const类型,则表明其是一个常函数,不能修改类的成员变量;
5)对于类的成员函数,有时候必须指定其返回值为const类型,以使得其返回值不为左值

 

#define相比,它有以下优点:

1. const可以进行类型检查

2. const支持一些编译器的断点调试。

 

 

3. 什么是预编译?何时需要预编译?

什么是预编译:

预编译又称为预处理 , 是做些代码文本的替换工作。
处理以# 开头的指令 , 比如拷贝 #include 包含的文件代码,#define 宏定义的替换 , 条件编译等,就是为编译做的预备工作的阶段。

主要处理#开始的预编译指令,预编译指令指示了在程序正式编译前就由编译器进行的操作,可以放在程序中的任何位置。

C 编译系统在对程序进行通常的编译之前,首先进行预处理。
c 提供的预处理功能主要有以下三种:

1 )宏定义 
2 )文件包含 
3 )条件编译
何时需要预编译:

总是使用不经常改动的大型代码体。
程序由多个模块组成,所有模块都使用一组标准的包含文件和相同的编译选项。在这种情况下,可以将所有包含文件预编译为一个“预编译头”

 

4. c++程序中调用被c编译器编译后的函数,为什么要加externc

如果C++程序要调用已经被编译后的C函数,该怎么办?
假设某个C函数的声明如下:
void foo(int x, int y);
该函数被C编译器编译后在库中的名字为_foo,而C++编译器则会产生像_foo_int_int之类的名字用来支持函数重载和类型安全连接。由于编译后的名字不同,C++程序不能直接调用C函数。C++提供了一个C连接交换指定符号extern“C”来解决这个问题。例如:
extern “C”
{
void foo(int x, int y);
… // 其它函数
}
或者写成
extern “C”
{
#include “myheader.h”
… // 其它C头文件
}
这就告诉C++编译译器,函数foo是个C连接,应该到库中找名字_foo而不是找_foo_int_int。C++编译器开发商已经对C标准库的头文件作了extern“C”处理,所以我们可以用#include 直接引用这些头文件。

 

 

 

你可能感兴趣的:(简答题2)