【C语言部分】
一、概念问答题:
static在C和C++里各代表什么含义 (语言)
答:C中:static (1)局部静态变量 (2)外部静态变量/函数 C++中:静态数据成员/成员函数
const在C/C++里什么意思(语言)
new&delete 和malloc&free的区别
答:它们都是动态管理内存的入口。
Malloc/free是C标准库的函数,new/delete是C++运算符。
Malloc/free需要手动计算空间的大小,new/delete可自动计算类型的大小。
Malloc/free的返回值是void*,new的返回值是对象类型的指针。
Malloc/free只是动态分配内存空间/释放空间。而new/delete除了分配内存空间还会调用构造函数和析构函数进行初始化。
随便写一个函数指针、指针数组和数 组指针
答:int (*pfun)(), int *p[],int (*p)[].
你觉得指针和数组相同吗?
讲讲你理解的指针。
const和#define有什么不同?
答:(1)编译器处理方式不同:define宏是在预处理阶段展开。Const常量是编译运行阶段使用。(2)类型和安全检查不同:define宏没有类型,不做任何类型检查,仅仅展开。Const常量具有类型,在编译阶段去执行类型检查。(3)存储类型不同:const常量是在内存中分配(堆/栈),define有多少地方使用,就展开多少次。(4)const可以节省空间,避免不必要的内存分配。
const 与 #define的比较
C++ 语言可以用const来定义常量,也可以用 #define来定义常量。但是前者比后者有更多的优点:
(1) const常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查。而对后者只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不到的错误(边际效应)。
二、编程题:
1.求数组(元素可为正数、负数、0)的最大子序列和。
int maxSubSum(const vector<int>& a)
{
int maxSum = 0;
for (int i = 0; i < a.size(); ++i)
{
for (int j = i; j < a.size(); j++)
{
int thisSum = 0;
for (int k = 0; k <= j; ++k)
{
thisSum += a[k];
}
if (thisSum > maxSum)
{
maxSum = thisSum;
}
}
}
return maxSum;
}
2.写一个针对整数的快速排序。
int Partition(int arr[], int low, int high)
{
int key = arr[low];
while (low < high)
{
while (low<high && arr[high] >= key)
{
high--;
}
arr[low] = arr[high];
while (low < high && arr[low] <= key)
{
low++;
}
arr[high] = arr[low];
}
arr[low] = key;
return low;
}
void QSort(int arr[], int low, int high)
{
if (low < high)
{
int keyloc = Partition(arr,low,high);
QSort(arr,low,keyloc-1);
QSort(arr, keyloc + 1, high);
}
}
int main()
{
int arr[] = { 15, 8, 19, 20, 12, 10, 9, 7 };
QSort(arr, 0, 7);
for (int i = 0; i < sizeof(arr) / sizeof(int); ++i)
{
cout << arr[i] << " ";
}
cout << endl;
4.编写一个函数求解第n个非波那契数字。
递归算法:
int Fibonacci(int n)
{
if (n == 0)
return 0;
else if (n == 1 || n == 2)
{
return 1;
}
else
{
return Fibonacci(n - 1) + Fibonacci(n - 2);
}
}
int main()
{
int ret = Fibonacci(8);
cout << ret << endl;
return ret;
}
非递归算法:
int Fibonacci(int n)
{
int f1 = 0;
int f2 = 1;
int f3;
for (int i = 2; i <= n; ++i)
{
f3 = f1 + f2;
f1 = f2 ;
f2 = f3;
}
return f3;
}
数组实现:
int Fibonacci(int n)
{
int fibArray[3] = { 0, 1, n };
for (int i = 2; i <= n; ++i)
{
fibArray[2] = fibArray[0] + fibArray[1];
fibArray[0] = fibArray[1];
fibArray[1] = fibArray[2];
}
return fibArray[2];
【1.C++基础知识】
1. 什么时候使用引用作为函数参数?
2. 什么时候使用引用做函数返回值?
3. 使用引用做函数返回值要注意些什么问题?
4. 什么时候使用常引用?
5. 引用和指针的区别和联系?
答:从概念上来讲,指针是一个实体,指针存储变量的地址;引用是一个别名。
引用只能在定义时初始化一次,之后不能改变指向其它变量(从一而终);指针变量的值可变,可以指向其它对象。
引用必须指向有效的变量,指针可以为空。sizeof指针对象和引用对象的意义不一样。sizeof指针是对象地址的大小。sizeof引用得到的是指向变量的大小。
指针和引用自增和自减意义不一样。相对而言,引用比指针安全。
6. const定义常量和#define 定义宏的优缺点?
7. C++中使用哪些技术可以替代宏?为什么建议使用使用这些技术去替代宏?
答:使用const/enum/inline function可以替代宏。Const和enum替代宏常量,inline function 替代宏函数。
(1) 宏不可以调试查看,const/enum/inline function可以调试。
(2) 写宏函数容易出错,代码的可读性和可维护性差。
(3) 宏常量和宏函数缺少类型安全的检查,使用const/enum/inline function时编译器会进行类型安全的检查。
8. malloc/free和new/delete的区别和联系?
9. 在C++程序中调用被C编译器编译后的函数,为什么要加extern"c"?