1.写一个“标准”宏,这个宏输入两个参数并返回较小的一个
答:#define MIN(x, y) ((x)<(y)?(x):(y))
注意 宏定义结尾没有分号。
2.#与##的作用?
答:#是把宏参数转化为字符串的运算符,##是把两个宏参数连接的运算符。
例如:
#define STR(arg) #arg 则宏STR(hello)展开时为”hello”
#define NAME(y) name_y 则宏NAME(1)展开时仍为name_y
#define NAME(y) name_##y 则宏NAME(1)展开为name_1
3.static关键字的作用?
答:1). 在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。
2). 在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量。
3). 在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这个函数被限制在声明它的模块的本地范围内使用。
4.const关键字的作用?
答:1声明常变量,使得指定的变量不能被修改。
2修饰函数形参,使得形参在函数内不能被修改,表示输入参数。
3修饰函数返回值,使得函数的返回值不能被修改。
5.extern关键字的作用?
答:1用于修饰变量或函数,表明该变量或函数都是在别的文件中定义的,提示编译器在其他文件中寻找定义。
2 用于extern “c
extern “c”的作用就是为了能够正确实现C++代码调用其他C语言代码。加上extern "C"后,会指示编译器这部分代码按C语言的编译方式进行编译,而不是C++的。
6.sizeof关键字的作用?
答:
sizeof是在编译阶段处理,且不能被编译为机器码。sizeof的结果等于对象或类型所占的内存字节数。sizeof的返回值类型为size_t。
7.结构体变量如何比较?
答:虽然结构体变量之间可以通过=直接赋值,但不同通过比较符如==来比较,因为比较符只作用于基本数据类型。这个时候,只能通过int memcmp(const void *s1, const void *s2, size_t n);来进行内存上的比较。
8.malloc/free与new/delete的区别
答:
malloc与free是C/C++语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存。
对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。因此C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以及一个能完成清理与释放内存工作的运算符delete。注意new/delete不是库函数。
我们不要企图用malloc/free来完成动态对象的内存管理,应该用new/delete。由于内部数据类型的“对象”没有构造与析构的过程,对它们而言malloc/free和new/delete是等价的。
9…h头文件中的ifndef/define/endif 的作用?
答:防止该头文件被重复引用。
10.什么是平衡二叉树?
答 :左右子树都是平衡二叉树 且左右子树的深度差值的绝对值不大于1。
11.冒泡排序算法的时间复杂度是什么?
答 :O(n^2)
12.(void )ptr 和 ((void**))ptr的结果是否相同?
答:其中ptr为同一个指针
.(void )ptr 和 ((void**))ptr值是相同的
13.用指针的方法,将字符串“ABCD1234efgh”前后对调显示
#include
#include
int main()
{
char str[] = "ABCD1234efgh";
int length = strlen(str);
char * p1 = str;//指向数组第一个元素下标;
char * p2 = str + length - 1;//指向数组最后一个元素下标;
while(p1 < p2)
{
char c = *p1;
*p1 = *p2;
*p2 = c;
++p1;
--p2;
}
printf("str now is %s\n",str);
return 0;
}
此题扩展为自己输入,然后逆序输出,大家可以试试;
14.写出程序把一个链表中的节点顺序倒排
typedef struct linknode
{
int data;
struct linknode *next;
}node;
//将一个链表逆置
node *reverse(node *head)
{
node *p,*q,*r;
p=head;
q=p->next;
while(q!=NULL)
{
r=q->next;
q->next=p;
p=q;
q=r;
}
head->next=NULL;
head=p;
return head;
}
15.写出程序删除链表中的所有节点
void del_all(node *head)
{
node *p;
while(head!=NULL)
{
p=head->next;
free(head);
head=p;
}
}
16.交换两个变量(整型)的值,且不允许使用中间值
int a,b;
a^=b;
b^=a;
a^=b;
注:a,b必须为整型变量
17.指针
1.区别int (*p)[5]和int *p[5]。
前者是一个指针,它指向一个含有5个元素的数组。后者是一个数组,它的长度为5,数组中每一个元素指向一个整型变量。
2.区别int *f( int i, int j)和 int (*p)( int i ,int j)
前者是返回指针的函数,它是一个函数的声明,后者是指向函数的指针,它定义了一个指针。
即前者是函数,后者为指针。
注:(1)不能对指向函数的指针做任何运算,如p++、p–、p+n、p-n都是错误的。
3.下面这个程序编译时会报错,请指出错误并改正。
#include
int main(void)
{
int **p;
int arr[100];
p = &arr;
return 0;
}
注:数组名arr的&arr是一个指向长度为100的数组的指针,而p是指向指针(该指针指向的是int型变量)的指针。改成这样就正确了:
#include
int main()
{
int (*p)[100];
int arr[100];
p = &arr;
return 0;
}
尚在学习,后面补齐!