解剖《C 语言深度解剖》

正如最近所看的 《 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 语言的独特见解,如有需要,欢迎购买实体书籍支持作者。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,802评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,109评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,683评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,458评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,452评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,505评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,901评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,550评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,763评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,556评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,629评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,330评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,898评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,897评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,140评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,807评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,339评论 2 342

推荐阅读更多精彩内容