C语言经典问题学习笔记之二
发布日期:2021-06-30 10:11:43 浏览次数:3 分类:技术文章

本文共 3658 字,大约阅读时间需要 12 分钟。

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://islet.blog.csdn.net/article/details/71195963 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:全局变量与局部变量的定义关系
下一篇:C语言经典问题学习笔记之一

发表评论

最新留言

哈哈,博客排版真的漂亮呢~
[***.90.31.176]2024年04月13日 14时13分14秒