C语言刷题坑收集1

 第一题:

C语言刷题坑收集1_第1张图片

(注意加黑字体的宾语)

int   *p[4];         //指针数组。  是个有4个元素的数组, 每个元素的是指向整型的指针。(每个元素都是指针的数组)
int   (*p)[4];       //数组指针。 它是一个指针,指向有4个整型元素的数组。                (指向有4个整型元素的数组的指针)
int *func(void);     //指针函数。 无参函数, 返回整型指针。             (函数的返回值为int*)    
int (*func)(void);   //表示函数指针,可以指向无参, 且返回值为整型指针的函数。      (函数的返回值为int) 

第二题:

一个函数定义的返回值是float,它不能在return语句中返回的值的类型是:

char 、int、 float、 long、 double、long long?

答案:经过测试,都可以进行转换,只会报警告   “return”: 从xxx转换到“float”,可能丢失数据 

第三题:

在gcc编译器下,针对以下代码,

1

2

3

4

5

6

7

8

9

const char str1[] = "abc";        

const char str2[] = "abc";

const char *p1 = "abc";

const char *p2 = "abc";

void fun()
{
    const char *p = "abc";
    printf("%d", p);

}

那么针对printf("%d %d %d %d\n",str1, str2,p1,p2)的结果, 则:输出的前两个数不同,输出的后两个数相同。

由于str1和str2在栈上申请内存,故地址不同,而p1和p2指向的是静态存储区,只有一个拷贝,因此地址相同,如果指向的是函数内部,但由于也是指向静态存储区,故函数内部的p和p1,p2地址相同。

第四题:

在C语言中,函数的隐含存储类别是()。

auto static extern register 无存储类别

答案为:extern

关于为什么不是auto而是extern,

“存储方式和生存期:

存储类型

变量类型

定义

存储方式

生存期

自动auto

动态局部变量

函数中局部变量不特意声明为静态存储类别,则都是动态存储

动态存储区

调用函数时,系统给变量自动分配动态存储空间,调用结束自动释放这些空间

静态static

静态局部变量

希望函数中的局部变量的值在函数调用结束后不消失而继续保留原值

静态存储区

整个程序运行期间

寄存器register

XXX

将局部变量的值放在CPU寄存器中

寄存器

XXX

外部extern

静态全局

将外部变量扩展到本源文件靠前位置或者扩展到其他源文件。

静态存储区

整个运行期间

“  ----------------引自csdn博客

“函数的存储类型指的是其他文件模块可否访问,其类别可以是extern或static。
static是指该函数只能被本源程序文件中的模块访问。extern是指可被本源程序文件外的模块访问。
C语言中函数的存储类型隐含为全局的,因此默认为extern。
函数内定义的变量,默认作用域在本函数内,即其类型是auto。”   -----------引自百度知道

“由于C函数内不能再定义函数,C函数的存储类型只能是静态的或外部的之一。若定义函数时不指定存储类型是静态的,则它的存储类型就是外部的(extern),即函数允许被程序的其它函数调用。所以解答是extern。”   -----------引自百度知道

以上三个观点似乎都能说明这个问题,但总觉得不够严谨,经参考此篇博客后,发现变量的存储类别和函数的存储类别:

变量存储类别分为:静态变量、auto:自动存储类别,默认的存储类别、static:静态存储类别、extern外部存储类别、register寄存器存储类型、动态变量

而函数的存储类别分为:static:内部函数、extern:外部函数(函数默认的存储类别)

因此这个问题得以解决。

第五题:

C++中32位单精度浮点数能表示的十进制有效数字是多少位?()

解析:

  1. 一个浮点数由三部分组成:符号位S、指数部分E(阶码)以及尾数部分M。

  2. 单精度浮点数(float)总共用32位来表示浮点数,其中尾数用23位存储,加上小数点前有一位隐藏的1(IEEE754规约数表示法),2^(23+1) = 16777216。因为 10^7 < 16777216 < 10^8,所以说单精度浮点数的有效位数是7位。考虑到第7位可能的四舍五入问题,所以单精度最少有6位有效数字(最小尺寸)。 

  3. 同样地:双精度浮点数(double)总共用64位来表示浮点数,其中尾数用52位存储,     2^(52+1) = 9007199254740992,10^16 < 9007199254740992 < 10^17,所以双精度的有效位数是16位。同样四舍五入,最少15位。

  4. 单7双16

 

你可能感兴趣的:(刷题)