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

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

1. bool,float,指针变量与零值比较的If语句?

bool flag;   if(flag)  if(!flag)

flaot x,X=0.00001;if(x>X)  if(x<=X) 这里涉及到精度限制问题

char *p;  if(p==NULL)   if(p!=NULL)

2.下面代码的结果是什么?为什么?

void foo()

{

unsigned int a = 6;

int b = -20;

(a+b)>6?puts(">6"):puts("<=6")

}

此题的结果是>6,因为当一个表达式中存在有符号和无符号类型的数据时,都将转化成无符号数据,因此-20将转化成一个很大的数。

3.以下为linux下32位的C程序,计算结果。

char str[]="hello";

char *p=str;

int n = 10;

sizeof(str)==?     sizeof(p)==? sizeof(n) ==?

答案:6 4 4 

因为str数组最后有个结束标志‘\0’,  p是一个指针,指针都是4个大小,int类型也是4

4.

typedef union {long i;int k[5]; char c;} DATE;

        struct data { intcat; DATE cow; double dog;} too;
        DATE max;
则语句printf("%d",sizeof(struct data)+sizeof(max));的执行结果是:

答:union类型是共用体,取最大大小int k[5]为20,即 20+4+20+8 = 52.

5.
 
请问以下代码有什么问题:
int
main()
{
  char a;
  char *
str
=&a;
 
strcpy
(
str
,"hello");
 
printf
(
str
);
  return 0;
}
标准答案

 没有为str分配内存空间,将会发生异常问题出在将一个字符串复制进一个字符变量指针所指地址。虽然可以正确输出结果,但因为越界进行内在读写而导致程序崩溃。

6.

long a  =  0x801010;

    a+5=?

   

标准答案

    0x801010用二进制表示为:1000 0000 0001 0000 0001 0000”

    十进制的值为8392720,再加上5就是8392725

7.

数组
int
c[3][3];
为什么
c
,*
c
的值相等,(
c+1
),(*
c+1
)的值不等
, c
,*
c
,**
c
,代表什么意思?

标准答案

c是第一个元素的地址,*c是第一行元素的首地址,其实第一行元素的地址就是第一个元素的地址,**c是提领第一个元素。 为什么c,*c的值相等?c:数组名;是一个二维指针,它的值就是数组的首地址,也即第一行元素的首地址(等于 *c),也等于第一行第一个元素的地址(& c[0][0]);可以说成是二维数组的行指针。

*c:第一行元素的首地址;是一个一维指针,可以说成是二维数组的列指针。

**c:二维数组中的第一个元素的值;即:c[0][0]

所以:c 和 *c的值是相等的,但他们两者不能相互赋值,(类型不同)

8.

 float
a,b,c
,

    等式 (a+b)+c==(b+a)+c  

             (a+b)+c==(a+c)+b   能否成立?

参考答案
两者都不行。在比较
float
double
时,不能简单地比较。由于计算误差,相等的概率很低。应判断两数之差是否落在区间(
-
e,e
)
内。这个
e
应比浮点数的精度大一个数量级。

9.

处理器标识
#error
的目的是什么?

参考答案编译时输出一条错误信息,并中止继续编译。  

10.

ASSERT()
的作用?

参考答案】ASSERT()是一个调试程序时经常使用的宏,在程序运行时它计算括号内的表达式,如果表达式为FALSE (0), 程序将报告错误,并终止执行。如果表达式不为0,则继续执行后面的语句。

这个宏通常原来判断程序中是否出现了明显非法的数据,如果出现了终止程序以免导致严重后果,同时也便于查找错误。

11.

strcpy
()
memcpy
()
的区别?

参考答案strcpy()memcpy()都可以用来拷贝字符串,strcpy()拷贝以’\0’结束,但memcpy()必须指定拷贝的长度。

12.

用变量
a
给出下面的定义

  1)一个有10个指针的数组,该指针是指向一个整型数的;

   2)一个指向有10个整型数数组的指针;

   3)一个指向函数的指针,该函数有一个整型参数并返整型数;

   4)一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数;

 【标准答案1int* a[10];    3int(*a)[10] 

                       3int(*a)(int);  4int(*a[10])(int)

13.

请问以下代码有什么问题:                                
char* s="AAA";
printf
("%
s",s
);
s[0]='B';
printf
("%
s",s
);
有什么错?
 【
标准答案

"AAA"是字符串常量。s是指针,指向这个字符串常量,所以声明s的时候就有问题。

cosnt char* s="AAA";
然后又因为是常量,所以对是s[0]的赋值操作是不合法的。

14.

int
(*s[10])(
int
)
表示的是什么啊
标准答案
int
(*s[10])(
int
)
函数指针数组,每个指针指向一个
int
func
(
int
param
)
的函数。

15.

void * ( * (*fp1)(
int
))[10]
表示什么意思?

标准答案】                                                          void * ( * (*fp1)(int))[10];

  fp1是一个指针,指向一个函数,这个函数的参数为int型,函数的返回值是一个指针,这个指针指向一个数组,这个数组有10个元素,每个元素是一个void*型指针。

16.

void * ( * (*fp1)(
int
))[10]
表示什么意思?

标准答案】                                                          void * ( * (*fp1)(int))[10];

  fp1是一个指针,指向一个函数,这个函数的参数为int型,函数的返回值是一个指针,这个指针指向一个数组,这个数组有10个元素,每个元素是一个void*型指针。

17.

float (*(* fp2)(
int,int,int
))(
int
)
表示什么意思

标准答案】fp2是一个指针,指向一个函数,这个函数的参数为3int型,函数的返回值是一个指针,这个指针指向一个函数,这个函数的参数为int型,函数的返回值是float型。

18.

int
(* ( * fp3)())[10]()
表示什么意思

 标准答案】 fp3是一个指针,指向一个函数,这个函数的参数为空,函数的返回值是一个指针,这个指针指向一个数组,这个数组有10个元素,每个元素是一个指针,指向一个函数,这个函数的参数为空,函数的返回值是int型。

19.

 c
c++
中的
struct
有什么不同?
标准答案

     cc++struct的主要区别是c中的struct不可以含有成员函数,而c++中的struct可以。c++structclass的主要区别在于默认的存取权限不同,struct默认为public,而class默认为private

20.

const
 
#define
的比较,
const
有什么优点
?

参考答案

1const常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查。而对后者只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不到的错误(边际效应)。

2)  有些集成化的调试工具可以对 const常量进行调试,但是不能对宏常量进行调试。

转载地址:https://islet.blog.csdn.net/article/details/70597596 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:C语言经典问题学习笔记之二
下一篇:5分钟做出简单makefile(linux)

发表评论

最新留言

做的很好,不错不错
[***.243.131.199]2024年05月01日 06时14分02秒