您的位置:首页 > 编程语言 > C语言/C++

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

2017-05-05 14:05 330 查看
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.

  charszstr[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.

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

 

【标准答案】提示编译器对象的值可能在编译器未监测到的情况下改变。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c语言 指针 存储