C语言经典问题学习笔记之二

xiaoxiao2021-02-28  160

1. 请你谈谈引用和指针的区别。

参考答案

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 常量               

 2const可以修饰函数的参数、返回值,甚至函数的定义体。被 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 有什么含意?

 

标准答案 提示编译器对象的值可能在编译器未监测到的情况下改变。
转载请注明原文地址: https://www.6miu.com/read-24788.html

最新回复(0)