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

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 有什么含意?

 

标准答案 提示编译器对象的值可能在编译器未监测到的情况下改变。
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值