首页
社区
课程
招聘
[原创]C语言学习抄书笔记
发表于: 2013-4-10 12:23 42908

[原创]C语言学习抄书笔记

2013-4-10 12:23
42908

首先,为什么是C语言?

    很多人看到标题可能都会惊讶,都这个年代了,为什么要从头学习C语言?

    编程语言这个东西一直是仁者见仁智者见智的。从计算机出现到现在,不说有上百种语言,大几十种总是有的。你硬要说哪个语言优于其余所有,基本上是没有这种可能性的。这么做唯一能导致的就是大家为了各自的观点没完没了的吵下去。因此,学习哪门语言纯粹就是个人爱好问题。

    而我选择C语言的原因无外乎以下三点:

    一、现在的用户界面几乎被两个东西主宰,1)Web,2)移动设备IOS或Android。Windows的图形界面不吃香了。越来越多的企业在用成本低性能高的Linux和各种开源技术来构架其系统,Windows的成本太高。因此,未来的趋势是前端Web+移动,后端是Linux+开源(抄自http://coolshell.cn/articles/4990.html)。笔者也是看了这个才下定决心从头开始学习C语言。

    二、技术更新太快。不夸张的讲,如果你一年不关注互联网,不关注技术更新,那么你会完全听不懂那些技术名词。其实,很多东西都是过分炒作出来的,并不值得我们全身心的投入其中(参照http://coolshell.cn/articles/3609.html)。而C语言作为一个流行了40年的技术,它值得你去关注和认真学习。

    三、这是一个很个人的原因。笔者虽然是计算机专业出身,但基础相当不扎实。上大学的时候笔者经常跟着老师做项目,当时为了追求快速上手而选择了C#。那时也年轻,什么都不懂,被课题老师忽悠了。就觉着用.net实现各种功能相当之方便,弄个加密算法都有封装好的函数给你用,图形界面什么的就更没得说。然后就认为C语言什么的都弱爆了,整天沉迷项目忽悠经费,自然C语言和数据结构那系列的课程就没好好学。等工作后才发现太过高级的东西往往会带来很多不方便,为了工作又重新捡起C++开始鼓捣,依然是为了快速上手而忽略基础的学习,图形界面直接MFC,拖托跩跩自以为很熟练。现在想想很后悔,底层的东西一问三不知,高级的东西又上不了手,整个就是一只会做体力活的码农。痛定思痛决定从头开始系统学习。

    此次学习没有项目压力,可以完全放松下来扎实地打好基础。当然由于是自学性质,只能在工作之余进行,时间上就难以保证了。此次学习的原则就是把自己当作是什么都不会的新人,不放过C语言的每一个细节,哪怕是变量声明,函数定义,for循环,while语句等等这些最最基本的东西都认真的再看一遍,并留下简要的笔记。而这篇帖子的目的在于强迫自己认认真真的完成这份学习计划,也是担心自己没有耐性,对于已经熟悉的东西一眼带过,丢失细节。

    本次学习历程会尽可能选择一些经典名书来学习,毕竟站在巨人的肩膀上总会省些力气。当然其中也会穿插着几本笔者当年买过的烂书,大概过一遍,总不好浪费。流程大概如下:

    第一步,完成《C程序设计语言(第二版.新版)》的学习;
    第二步,完成《C指针编程之道》的学习;
    第三步,完成《算法导论》的学习;
    第四步,完成《Unix高级环境编程》和《Unix网络编程》的学习。

    至于再往后目前没有想好,先做完前四步吧。其实,这份计划对我来说难度不小,不知道能否坚持下来。总之,一步一个脚印的先走着吧。

其次,搭建开发环境

    所谓工欲善其事,必先利其器。幸运的是C语言的开发无论是Windows还是Linux都可以轻松胜任。不过笔者夹杂着借此机会转投Linux阵营的念头。所以就放弃了奋斗多年的Windows平台,最终选择了Ubuntu + gcc + vim,多么酷的组合啊,想想就兴奋。

    话说回来,其实什么平台都一样,认真学习才是王道。

    接下来开始第一步,进行《C程序设计语言(第二版.新版)》的学习。

目录:

《C程序设计语言》 第一章 导言  20楼
《C程序设计语言》 第二章 类型、运算符与表达式
《C程序设计语言》 第三章 控制流
《C程序设计语言》 第四章 函数与程序结构
《C程序设计语言》 第五章 指针与数组
《C程序设计语言》 第六章 结构
《C程序设计语言》 第七章 输入与输出

这本书目前来看很烂,污眼不负责。
《C指针 编程之道》 第一章 C语言指针
《C指针 编程之道》 第二章 指针在数组中的应用
《C指针 编程之道》 第三章 指针在函数中的应用
《C指针 编程之道》 第四章 指向指针的指针
《C指针 编程之道》 第五章 数据结构中指针的应用
《C指针 编程之道》 第六章 指向文件类型的指针


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 6
支持
分享
最新回复 (81)
雪    币: 134
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
前排沙发。楼主加油!
2013-4-10 12:33
0
雪    币: 371
活跃值: (72)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
3
有种想跟楼主一起学的冲动
2013-4-10 12:33
0
雪    币: 65
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
C自学还在摸索中
2013-4-10 13:22
0
雪    币: 2362
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
这种发帖子的 全部都是会坑的
2013-4-10 14:06
0
雪    币: 250
活跃值: (25)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
感谢感谢
2013-4-10 14:54
0
雪    币: 250
活跃值: (25)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
7
那就来呗,闲着也是闲着,难得有冲动~
2013-4-10 14:55
0
雪    币: 250
活跃值: (25)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
8
碰上有共同目标的了
2013-4-10 14:56
0
雪    币: 250
活跃值: (25)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
9
发不发帖,坑不坑都是我自己的事,不喜欢不支持可以直接点右上角关闭。
2013-4-10 14:57
0
雪    币: 371
活跃值: (72)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
10
我来说说吧,希望对楼主有帮助

c语言,首先你就要掌握指针的概念,然后,编几个小程序,验证自己是否真的懂指针
然后,你就"无敌"了,因为你掌握了 内存模型  ,恩,可以把书本丢一边去了,啃书太无聊了
你就试着用c来实现自己想写的一些东西,然后,你就会发现,你语法不熟,
拿起书本,把语法抄到眼睛一眼就能看到的地方,然后按着语法来写,然后........................

恩,写一个月的代码,c就会了...
2013-4-11 10:25
0
雪    币: 371
活跃值: (72)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
11
顺带一说,我是用od调试程序,才对指针有非常深刻的了解的,一定要多用od调试一些简单的程序
,只要掌握了 "内存模型"  ,想不会c都难~~~
2013-4-11 10:27
0
雪    币: 371
活跃值: (72)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
12
编程嘛,什么都不说,先给我编就是了,啃书本啃不出高手来的,这是N多大牛的忠告(貌似有太多人进入了这个误区.),O(∩_∩)O,

书本只能教你语法,而不能在你头脑中形成指针的概念~~~就这样`(*∩_∩*)′
2013-4-11 10:35
0
雪    币: 258
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
共同学习今天的成果呢?
2013-4-11 10:45
0
雪    币: 1217
活跃值: (621)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
14
我是学经济的不过对计算机很感兴趣,现在也在学c,顺带看着算法导论,都是英文,看的慢!那些翻译过来的又翻得太烂, 哎,路漫漫其修远兮,吾将上下而求索!
2013-4-11 10:50
0
雪    币: 250
活跃值: (25)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
15
感谢感谢~~
2013-4-11 15:03
0
雪    币: 250
活跃值: (25)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
16
在硬盘上,最近事多顾不上发唉。今晚或者明天上午准能出来,顺便预告一下,《C程序设计语言》 第一章 导言。
2013-4-11 15:05
0
雪    币: 250
活跃值: (25)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
17
慢慢琢磨中。
2013-4-11 15:06
0
雪    币: 197
活跃值: (19)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
一直很羡慕会编程的大侠们,也曾学过C,可是半路出家的,没有一点基础,实在是不好学啊,楼主很有毅力,坚持吧
2013-4-11 21:24
0
雪    币: 230
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
能做自己喜欢的事就OK了
2013-4-11 23:32
0
雪    币: 250
活跃值: (25)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
20
1.1 入门(要我看就是——千里之行,始于Hello, World!)

    听说任何一门语言的1.1都是Hello, World!。这本书也不例外。由于这次学习是格外注重细节的一次,所以最简单的代码也要上一下。

#include <stdio.h>

int main()
{
    printf("Hello, World!\n");
    return 0;
}



    头文件,main函数,printf,return,也没什么好强调的,出错也只可能是不小心敲错的吧。这里主要说一下gcc下编译的问题。方法:

gcc -Wall 文件名.c -o 文件名

    其中需要注意-Wall的大写,Linux下的”终端“对大小写敏感,这不像Windows的cmd那么随意。-o是为了指定输出文件名,如果你不觉着a.out很难看,那不加也无所谓。-Wall听说是最严格的错误警告提示,具体的我也没关心,先这么用着就是了。这里的Wall可不是墙,而是几个参数的组合。说笑。gcc的功能丰富得可以专门写一篇教程了,有功夫再研究吧。

    顺带提一下,以HelloWorld为例,默认不优化的情况下,gcc编译出来的bin是7.4k,vc6记着是20k,vs2010下的c++是3k,不过vs2010的库比较特殊,使用静态库的话应该是40k+。总的来说gcc还是蛮喜人的。(纯靠记忆写的,有错误请指正。)

1.2 变量与算数表达式
1.3 for语句

    使用公式°C= (5/9)(°F-32)输出华氏温度和摄氏温度对照表。要求简单,直接上代码。(码农本色尽显

int main()
{
    int fahr;

    for(fahr = 0; fahr <=300; fahr += 20)
        printf("fahr:%3d - celsious:%3d\n", fahr, 5*(fahr-32)/9);

    return 0;
}


    既然是C语言学习,那就一行不要浪费,尽可能短,能省则省。

    忘了在哪看到过一段话,是讲int和long,float和double之间取舍的问题。

    大多数机器上使用int进行整型计算不易出错。但int只有16位,long是32位长int。但是long计算的运行代价要远高于int,需按细节考虑。而浮点运算中,要尽量使用double。精度高很多,而运算代价可忽略。但long double没必要。(float只能保证6位有效数字,而double则可保证至少10位)

1.4 符号常量

    符号常量就是:

#define MAXISUM 200


    这种形式的声明。不赘述。

1.5字符输入/输出

    有关getchar()和putchar()的内容。直接上码一目了然。

int main()
{
    int c;

    while((c = getchar()) != EOF)
        putchar(c);
    
    return 0;
}


    这里的变量c为何声明为int型而不是char型,原书给出的解释是变量c必须足够大,除了能存储任何可能的字符外,还要能存储文件结束符EOF。这里可以通过

printf(“%d %d”, sizeof(int), sizeof(char));


来验证一下。

    另外(c = getchar())最外面的()务必不能省略,因为!=的运算优先级要高于=。

1.6 数组

    数组无非就是这么个形式:

int array[10];


    除了下标是从0开始外,貌似没什么好记的吧。

1.7 函数
1.8 参数——传值调用

int function(int m, int n)
{
    ...
    return 0;
}


    归纳总结起来就是这个样子吧。

1.9 字符数组

    字符数组是C语言中最长用的数组类型。下面还是通过程序来展示字符数组以及操作字符数组的函数的使用方法。该程序读入一组文本行,并输出最长的文本行。该算法的基本框架非常简单:

while(还有未处理的行)
    if(该行比已处理的最长行还要长)
        保存该行为最长行
        保存该行的长度
    输出最长的行

还是直接上代码。

#define MAXLINE 1000

int inputline(char line[], int maxline); //对每一次输入进行处理
void copy(char des[], char org[]); //保存当前输入行

int main()
{
    int len, max;
    char line[MAXLINE], longest[MAXLINE];
    
    max = 0;
    while((len = inputline(line, MAXLINE)) > 0)
    {
        if(len > max)
        {
            max = len;
            copy(longest, line);
        }
        
        if(max > 0)
            printf("the longest line : %s\n", longest);
    }

    return 0;
}

int inputline(char line[], int maxline)
{
    int c, i;
    for(i = 0; i < maxline -1 && (c = getchar()) != EOF && c != '\n'; i++)
        line[i] = c;

    line[i] = '\0';
    
    return i;
}

void copy(char des[], char org[])
{
    int i;
    i = 0;
    
    while((des[i] = org[i]) != '\0')
        i++;
}


    这里面需要解释一下的有这么两点:
   
    一、在int inputline(char line[], int maxline)中,char line[]这一数组定义未声明大小。原因是该数组是在main函数中声明其大小的。

    二、在C语言中是以'\0'来标志字符串的结束的,因此在inputline函数中,需要把字符串的最后一位字符'\n'改为'\0'。

1.10 外部变量与作用域

    外部变量通俗的来讲就是全局变量。外部变量必须定义在所有函数之外,且只能定义一次。声明的时候可以通过extern语句显式声明,也可以通过上下文隐式声明。(不得不说这翻译的相当晦涩难懂)

还是举例子比较清晰。(个人理解,如有不对请指正。)

显式声明如下:

int main()
{
    extern int i;
    extern char str[];
    …
    ...
}


    然后你就可以在后面定义的函数里使用i和str[]了。

    如果外部变量定义在函数之前,就可以省略掉extern声明。比如定义在源文件的开始处,此为通过上下文隐式声明。如下所示:

include <stdio.h>
int i;
char str[];

int main()
{
    ...
    ...
}


    然后你就可以在后面定义的函数里使用i和str[]了。
    另外再摘抄一下“定义”和“声明”的区别。“定义”表示创建变量或分配存储单元,而“声明”是指说明变量的性质,而不分配存储单元。(依然晦涩难懂,纯摘抄而已。反正我是不准备纠结到底是用“定义”还是“声明”,哪个顺嘴就用哪个,明白说什么就好。)

    好了,《C程序设计语言》 第一章到此结束。总结一下,第一章通过几个简单的例子简单的介绍了一下C语言的基本情况。其中,变量,常量,数组,算数表达式,for/while循环语句,函数参数都将是贯穿C语言学习始终的重要元素。而全局变量虽然有其灵活的优势,在特定程序中能节省很大一部分力气,但考虑到其不易维护性,以及程序的可读性,在使用中应尽可能避免。以上纯属个人片面理解,如有错漏,敬请指正。
2013-4-12 00:05
0
雪    币: 250
活跃值: (25)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
21
其实,大牛往往都是半路出家的。科班出身反而不占优势。。。
2013-4-12 08:01
0
雪    币: 250
活跃值: (25)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
22
嗯嗯,我也这么想
2013-4-12 08:13
0
雪    币: 258
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
已阅坐等明天的
2013-4-13 22:09
0
雪    币: 250
活跃值: (25)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
24
真巧,正要发
2013-4-13 22:13
0
雪    币: 297
活跃值: (120)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
25
没什么语言是看书能看会的,看别人游泳看一被子也学不会游泳,很庆幸我再走了一段时间弯路以后,信了某位大牛的话,我是来围观的
2013-4-13 22:37
0
游客
登录 | 注册 方可回帖
返回
//