hylerrix / university

:mortar_board: my university code & article collection: create & share, thought & works
Creative Commons Attribution Share Alike 4.0 International
45 stars 10 forks source link

[A13]解剖《C 语言深度解剖》 #23

Open hylerrix opened 7 years ago

hylerrix commented 7 years ago

正如最近所看的 《 C 语言深度解剖》一书的前言所说,这篇文章的解剖只是引领大家进入 C 语言的大门,谈不上“熟悉”和“精通”。解剖过程中发现如果每一个要点尽可能详细的讲只会是对该书的复制粘贴过程,最终精简为如下思维导图和问答题目。

普通人用 C 语言在 3 年之下,一般来说,还没掌握 C 语言; 5 年之下,一般来说,还没熟悉 C 语言; 10 年之下,谈不上精通。

- 关键字 -

- 符号 -

- 预处理 -

- 指针和数组 -

- 内存管理 -

- 函数 -

- 关键字 -

1:声明并定义 int i=0; 后,以下哪个选项编译时会出现错误
sizeof(int);    // (A)
sizeof(i);    // (B)
sizeof int;    // (C)
sizeof i;    // (D)
2: sizeof(int)*p 表示什么意思?
3: 以下程序的输出结果是什么?
int main() {
    char a[1000];
    int i;
    for(i=0; i<1000; i++) {
        a[i] = -1-i;
    }
    printf("%d",strlen(a));return 0;
}
4: -0 和+0 在内存里面分别怎么存储?
5:以下变量定义并初始化后 i+j 的值为多少?为什么?
int i = -20;
unsigned j = 10;
6:以下代码有什么问题?
unsigned i;
for (i=9;i>=0;i--) {
    printf("%u\\\\n",i);
}
7:define 是关键字吗?
8:case 语句后面是否可以是 const 修饰的只读变量呢?
9:区分以下几行代码(答案已给出)
const int *p;    // const 修饰 *p,p是指针,*p是指针指向的对象,不可变
int const *p;    // const 修饰 *p,p是指针,*p是指针指向的对象,不可变
int *const p;    // const 修饰 p,p 不可变,p 指向的对象可变
const int *const p;    // 前一个 const 修饰*p,后一个 const 修饰 p,指针 p 和 p 指向的对象都不可变
10:在以下枚举变量的声明中,sizeof(ColorVal)的值为多少?为什么?
enum Color
{
    GREEN = 1,
    RED,
    BLUE,
    GREEN_RED = 10,
    GREEN_BLUE
}ColorVal;
11:都有哪些方法可以定义一个动态数组
12. 请写一个 C 函数,若处理器是Big_endian 的,则返回 0;若是 Little_endian 的,则返回 1。
13:在 x86 系统下,下面程序的运行结果是多少?
#include <stdio.h>
int main()
{
    int a[5]={1,2,3,4,5};
    int *ptr1=(int *)(&a+1);
    int *ptr2=(int *)((int)a+1);
    printf("%x,%x",ptr1[-1],*ptr2);
    return 0;
}
14:在声明 int i=0; 后以下哪个选项会报错呢
A),sizeof(int); 
B),sizeof(i); 
C),sizeof int; 
D),sizeof i;
15:sizeof(int)*p 表示什么意思?
16:const volatile int i=10;这行代码有没有问题?如果没有,那 i 到底是什么属性?
17:#define a int[10]与 typedef int a[10];的区别
18:return; 语句对吗?返回的到底是什么?
19:在 switch case 语句中能否使用 continue 关键字?为什么?
20:const 修饰的只读变量不能用来作为定义数组的维数,也不能放在 case 关键字后面。
21:声明并定义 int *p = NULL; 后,以下哪个选项的写法是正确的
if(p == 0);    // (A)
B), if(p);    // (B)
C), if(NULL == p);    // (C)
D), p?NULL:NULL;    // (D)
22:以下程序中 sizeof() 的值为?
struct TestStruct1 { 
    char c1;
    short s;
    char c2;
    int i;
};
23:判断:C编译器不仅仅是将C语言编译成汇编语言,还会对代码进行优化。
24:int main(void){return 0;} 的意义。

- 符号 -

1:1,'1',"1"有什么区别
2:0x01<<2+3 的值为多少?
3:int i = 1;后,++i+++i+++i 的值是多少?为什么?
4:以下程序运行结果是什么?为什么?
5:2/(-2)的值为多少?2%(-2)的值呢?
for(i=0,printf(“First=%d”,i);
    i<10,printf(“Second=%d”,i);
    i++,printf(“Third=%d”,i))
{
    printf(“Fourth=%d”,i);
}

 

- 预处理 -

1:下面代码中,(A) 和 (B) 的用法是否正确
#define BSC //
#define BMC /*
#define EMC */
BSC my single-line comment    // (A)
E),BMC my multi-line comment EMC    // (B)
2:#define EMPTY 这样定义行吗?
3:以下宏定义后,z 的值为多少
#define X 3
#define Y X*2
#undef X
#define X 2
int z=Y;
4:什么是内存对齐?如何避免内存对齐的影响?
5:简述什么是大小端?
6:简述 asert() 宏的功能和原理

- 指针和数组 -

1:int p = NULL 和p = NULL 的区别
2:int a[10] 中 &a[0]和&a 的区别
3:以下程序的输出结果是什么
int main() {
    int a[5]={1,2,3,4,5};
    int *ptr=(int *)(&a+1);
    printf("%d,%d",*(a+1),*(ptr-1));
    return 0;
}
4:指针和数组的区别
5:假设 p 的值为 0x100000。 如下表表达式的值分别为多少?
struct Test{
    int Num;
    char *pcName;
    short sDate;
    char cha[2];
    short sBa[4];
}*p;

p + 0x1 = 0x ? (unsigned long)p + 0x1 = 0x? (unsigned int*)p + 0x1 = 0x___?

6:在 x86 系统下,其值为多少?
int main() {
    int a[4]={1,2,3,4};
    int *ptr1=(int *)(&a+1);
    int *ptr2=(int *)((int)a+1);
    printf("%x,%x",ptr1[-1],*ptr2);
    return 0;
}
7:以下程序的打印结果是多少
#include <stdio.h>

int main(int argc,char * argv[]) {
    int a [3][2]={(0,1),(2,3),(4,5)};
    int *p;p=a [0];
    printf("%d",p[0]);
    return 0;
}
8:以下程序中 &p[4][2] - &a[4][2]的值为多少?为什么?
int a[5][5];
int (*p)[4];
p = a;
9:判断:main 函数内的变量不是全局变量,而是局部变量,只不过它的生命周期和全局变量一样长而已。
10:以下程序的三个语句分别表达什么意思?
char * (*fun1)(char * p1,char * p2);    \\ (A)
char * *fun2(char * p1,char * p2);    \\ (B)
char * fun3(char * p1,char * p2);    \\ (C)
11:以下程序中 (int)&p=(int)Function; 是什么意思?
void Function() {
    printf("Call Function!\n");
}

int main() {
    void (*p)();
    *(int*)&p=(int)Function;
    (*p) ();
    return 0;
}
12:以下程序的两个语句分别是什么意思?
(*(void(*) ())0)();
(*(char**(*) (char **,char **))0) ( char **,char **);
13:柔性数组的定义和使用方法?

- 内存管理 -

1:栈、堆和静态区的区别
2:用 malloc 函数申请 0 字节内存会返回 NULL 指针吗?
3:判断:free 函数只是把这块内存和 p 之间的所有关系斩断,指针变量 p 本身保存的地址并没有改变,那块被释放的内存里面保存的值也没有改变。

- 函数 -

1. 以下程序的输出结果是什么?为什么?
void fun(int i) {
    if (i>0) {
        fun(i/2);
    }
    printf("%d\n",i);
}

int main() {
    fun(10);
    return 0;
}
2. 编程:不使用任何变量编写 strlen 函数。

- 其他 -

1. 类 C 语言和标准 C 语言的主要区别是什么

写在最后

这篇文章灵感和素材均来源自《C 语言深度解剖》这本书,感谢作者对 C 语言的独特见解,如有需要,欢迎购买实体书籍支持作者。