【参考答案】
(1)引用被创建的同时必须被初始化(指针则可以在任何时候被初始化) 。
(2)不能有 NULL 引用,引用必须与合法的存储单元关联(指针则可以是NULL) 。
(3)一旦引用被初始化,就不能改变引用的关系(指针则可以随时改变所指的对象) 。
2.
void getmemory (char *p) { p=(char *) malloc (100); strcpy ( p,“hello world”); } int main( ) { char * str =NULL; getmemory ( str ); printf (“%s/n”, str ); free( str ); return 0; } 会出现什么问题?【标准答案】程序崩溃,getmemory中的malloc不能返回动态内存,即形参p是接收的str的地址,而在malloc的过程中,p的值发生了变化,而str的内容还是原来的NULL/
3.
char szstr [10]; strcpy (szstr,"0123456789"); 产生什么结果?为什么? 【 标准答案 】 长度不一样,出现段错误。 4. 数组和链表的区别?
【标准答案】
数组:数据顺序存储,固定大小; 链表:数据可以随机存储,大小可动态改变
5.
void main() { char aa [10]; printf (“%d”, strlen ( aa )); } 会出现什么问题?打印结果是是多少?
【标准答案】sizeof()和初不初始化,没有关系,strlen()和初始化有关,打印结果值未知。
6.
给定结构 struct A { char t:4; char k:4; unsigned short i:8; unsigned long m; };问sizeof(A) = ?
【标准答案】8
7.
struct name1{ char str ; short x; int num ; } ;求sizeof(name1)?
【标准答案】8
8.
struct name2{ char str ; int num ; short x; }; 求 sizeof (name2) ?
【标准答案】12
9.
程序哪里有错误wap( int*p1,int* p2 )
{
int *p;
*p = *p1;
*p1 = *p2;
*p2 = *p;
}
【标准答案】p为野指针
10.
(void*) ptr 和 (*(void**)) ptr 的结果是否相同?其中 ptr 为同一个指针。
【标准答案】(void*)ptr和(*(void**))ptr值是相同的
11.
要求设置一绝对地址为 0x67a9 的整型变量的值为 0xaa66 ? 【 标准答案 】int *ptr; ptr = (int*)0x67a9; *ptr = 0xaa55;
*( int * const )(0x67a9) = 0xaa55;
12.
要对绝对地址 0x100000 赋值,我们可以用 (unsigned int *)0x100000= 1234; 那么要是想让程序跳转到绝对地址是 0x100000 去执行,应该怎么做? 【 标准答案 】*((void (*)( ))0x100000 ) (); 首先要将0x100000强制转换成函数指针,即: (void (*)())0x100000 然后再调用它: *((void (*)())0x100000)();
13.
int a,b,c 请写函数实现 c= a+b , 不可以改变数据类型 , 如将 c 改为 long int , 关键是如何处理溢出问题【标准答案】 bool add (inta, intb,int *c) { *c=a+b; return (a>0 && b>0&&(*c<a || *c<b) || (a<0 && b<0&&(*c>a|| *c>b))); }
14.
头文件中的 ifndef /define/ endif 干什么用?
【标准答案】防止该头文件被重复引用。
15.
关键字 volatile 有什么含意 ? 并给出三个不同的例子。 【 参考答案 】 一个定义为 volatile 的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。下面是 volatile 变量的几个例子: 1). 并行设备的硬件寄存器(如:状态寄存器) 2). 一个中断服务子程序中会访问到的非自动变量 (Non-automaticvariables) 3). 多线程应用中被几个任务共享 的变量
16.
#include < filename.h > 和 #include “ filename.h ” 有什么区别?
【标准答案】对于#include <filename.h> ,编译器从标准库路径开始搜索filename.h ; 对于#include “filename.h” ,编译器从用户的工作路径开始搜索 filename.h。
17.
const 有什么用途?(请至少说明两种)
【标准答案】
(1)可以定义const 常量
(2)const可以修饰函数的参数、返回值,甚至函数的定义体。被 const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。
18.
下面的声明都是什么意思?constint a; intconst a; constint *a; int * const a; intconst * a const;
【 标准答案 】两个的作用是一样,a是一个常整型数。 第三个意味着a是一个指向常整型数的指针(也就是,整型数是不可修改的,但指针可以)。 第四个意思a是一个指向整型数的常指针(也就是说,指针指向的整型数是可以修改的,但指针是不可修改的)。最后一个意味着a是一个指向常整型数的常指针(也就是说,指针指向的整型数是不可修改的,同时指针也是不可修改的
19.
Heap 与 stack 的差别。标准答案】Heap是堆,stack是栈。 Stack的空间由操作系统自动分配/释放
Heap上的空间手动分配/释放。 Stack空间有限,Heap是很大的自由存储区
C 中的 malloc 函数分配的内存空间即在堆上 ,C++ 中对应的是 new 操作符。 程序在编译期对变量和函数分配内存都在栈上进行 , 且程序运行过程中函数调用时参数的传递也在栈上进行。
20.
程序的局部变量存在于 ___ 中,全局变量存在于 ____ 中,动态申请数据存在于 ___ 中。
【标准答案】程序的局部变量存在于栈(stack)中,全局变量存在于静态数据区 中,动态申请数据存在于堆(heap)中。
21.
堆栈溢出一般是由什么原因导致的?【 标准答案 】 没有回收垃圾资源。
22.
队列和栈有什么区别?
【标准答案】队列先进先出,栈后进先出。
23.
用预处理指令 #define 声明一个常数,用以表明 1 年中有多少秒(忽略闰年问题)【 参考答案 】#defineSECONDS_PER_YEAR (60 * 60 * 24 * 365)UL
24.
用宏定义写出 swap ( x , y ),即交换两数。 【 标准答案 】 #define swap(x, y)(x)=(x)+(y);(y)=(x)–(y);(x)=(x)–(y);
25.
写一个 “ 标准 ” 宏,这个宏输入两个参数并返回较小的一个。【标准答案】#defineMin(X, Y) ((X)>(Y)?(Y):(X))//结尾没有;
26.
以下是求一个数的平方的程序 , 请找出错误 : #defineSQUARE(a)((a)*(a)) int a=5; int b; b=SQUARE(a++);
【标准答案】宏在预编译时会以替换的形式展开,仅仅会替换。涉及到宏的地方,不要用++ --,标准中对此没有规定,因此最终结果将会依赖于不同的编译器。执行程序的答案可能是25、也有可能是36。
27.
给定一个整型变量 a ,写两段代码,第一个设置 a 的 bit 3 ,第二个清除 a 的 bit 3 。在以上两个操作中,要保持其它位不变。【标准答案】
#define BIT3 (0x1 <<3) static inta; void set_bit3(void) voidclear_bit3(void) { {
a |= BIT3; a &=~BIT3; } }
28.
关键字 volatile 有什么含意?【 标准答案 】 提示编译器对象的值可能在编译器未监测到的情况下改变。