如何学习C语言?
我是一名windows程序员,使用的语言是c,其他语言我略知一二,但不擅长。或许对于初学者来说,第一件事就是选择一门编程语言。当然,这不是我今天要讲的内容。每种语言都有自己的专业领域和水平。当然,我对其他非C语言比较陌生,也不会站在C的立场上讲其他任何语言,好吧,一开始,
c语言是早期的计算机语言,最初诞生是为了提供一种基于UNIX系统的工作语言。然而,越来越多的人发现了它的优势和潜力。c本身已经接近底部了。适合开发系统软件甚至操作系统。个人认为是介于高级语言和汇编语言之间的中间语言。c语言是结构化语言(我觉得主要是指它的控制结构,比如if if-else while for等。).c编程已经提到了“自上而下,循序渐进”。函数是原子功能模块。模块化对于大型程序非常重要。有句话叫“高质量的程序首先是和人讨论和沟通,然后才是执行的效率”。当然,我个人认为任何一个节目编写者都应该养成特定的思维方式,用节目的思维方式去思考节目的实现。前提是对计算机底层技术有足够的了解。不然我觉得连学习都很难,什么都是思维的问题。按标准来说,C应该算是高级语言阵营的一员。但很多有C语言开发经验的程序员,通常会亲切地称C是介于低级语言和高级语言之间的一种中级计算机语言。当然不是因为C比高级语言差,而是因为C既有高级语言的结构和可理解性,又有低级语言的高效率。同时C的可移植性也很好。要知道越接近硬件,接近底层的语言越依赖硬件环境,这就是我们所说的设备依赖。c很好。说到这里,我们是从另一个角度来分析C。当然,每种语言都有自己的优缺点,C也是如此,比如从高级语言和顶层技术来看,C最大的弊端就是数据和算法的分离。举个例子,对于一个有几千行甚至上万行代码的程序,如果我修改了数据,比如我在结构中添加了一个字段,我的整个程序可能都要改动,这就大大降低了程序的复用性,大大延长了开发周期。但从底层来看,这也是c的优势,我为什么要这么说呢?我个人认为在解决和实现一个小问题的时候,可以写一个通用的模块来处理不同的数据。当然,比如我们可以根据数据结构写一些常用的算法。在开发时,我们可以直接将预先编写好的模块插入到我们的程序中。这不也大大缩短了开发周期吗?初学者可以根据自己的需求写一个自定义库。嗯,有些事情我理解错了,请指出,沟通很重要,前提是你保持心态平和。下面我就说说这个问题的重点,就是如何学习C语言,这是给初学者的。
主题部分:
有人可能会说:还需要你来教学习。谁没上过学?其实我今天想说的只是从一个有经验的人的角度来分析和解释C语言学习过程中的难点。当然,更具体的问题我也会说明(个人观点)。我一直在强调我个人的观点。我想让大家明白,对于同一个问题,大家可能很难达成统一的意见。我希望你批评的时候有礼貌。
新手入门应该看哪些书:
在学习C语言之前,首先要选择一本教材。对于初学者,我个人不建议看电子书,还是买纸质书学习比较好。比如著名的《C程序设计》就很不错,尤其是第二版。我也看过,比较适合国内初学者。全书对C的语法结构进行了全面系统的讲解,组成C的语言元素包括:数据类型、支持的运算符、标识符(程序员根据命名规则给定的名称,用于变量名、函数名、宏名等。)、关键字(编译系统用来实现C内部功能的词,如转到goto、breaking等。),等等。看完这本书,基本上就能写一些简单的小程序了,当然是DOS下的程序。如果想进一步学习C,可以看《C陷阱与缺陷》这本书。写这本书的作者在贝尔工作。他对C非常精通,应该算是大师级人物。如果你暂时不想深入C,也没问题,因为这个时候你可以用C作为编程工具。你要做的就是多写代码,让自己熟悉C语言。经验很重要。“经验是检验真理的唯一途径。”当然,你不会纸上谈兵。如果你有了太多的开发经验,你就会知道,你原来在纸上或者电脑上想象的代码会实现,最终你会发现很多地方是不合理的,这是你以前想象不到的。在初学者学习C的过程中,比如你会看《C程序设计》来学习C,学完每一章就要完成习题。这是为了测试你学了什么,看看你的应用能力怎么样。尤其是编程这个话题很有意思。如果你有什么不明白的,可以回到书上的解释。如果不解释或者还是不明白,可以问问别人,和他们交流。bbs,QQ或者Google,直到你搞清楚为止。当你最终解决问题的时候,我敢打赌你一定很兴奋或者更兴奋。这个时候,知识已经在你的大脑里了。
这里我给你推荐几本关于C语言的好书:
c程序设计规范
c语言百科第四版(个人感觉不错,c标准里也有提到的东西)
c和指针
C编程语言(经典)
如果你想看电子书,上面的书在谷歌上很容易找到。
对c语言的初步了解;
对于初学者来说,问题会太多,因为你的知识面太小。现在我给大家讲解一些C相关的东西。目的是让你有明确的方向,安排好学习计划。专业上,我们是或将是程序员,程序员当然会开发程序。让我解释一下软件开发的术语:
C,C++,ASM,BASIC和Java都是计算机语言。计算机语言有很多,我就不说了。
Visual C++,Visual Basic,微软开发的开发环境。开发环境包括编译器和库函数(每一个C语言编译器都支持标准库,他们也会扩充自己的库,所以很多实现了库函数的程序员自从对比之后,一开始总是不用,切换到不同的开发环境,会遇到很多问题)。一些资源模板等等。视觉就是视觉,其次才是语言。Visual C++支持C和C++两种语言,根据文件扩展名决定使用哪个编译器内核。
什么是“面向对象”和“面向过程”?其实是两种完全不同的编程思路。C是面向过程的语言,而C++是面向对象的语言。面向对象语言中有“类”这种东西。在c语言中没有这种东西。对象是从类派生的实例,而类就像一个模板。
什么是SDK?SDK是一个软件开发工具包。它指的范围很广。一般来说,凡是能和软件开发过程相关的都属于它,比如库文件、参考资料、接口函数,当然,语言也应该属于它。
DDK是设备驱动程序开发工具包。
Turbo C:这是一个精致的C语言编译器。
理论上任何语言都可以在任何操作系统上运行,前提是操作系统支持,也就是我们所说的应用编程接口,比如window API(应用编程接口)。其实微软定义的接口函数是用来实现Windows的一些内部功能的。有些对象的描述术语在不同的平台上是不一样的,比如Windows下的“call”常被称为“call”,而“return”则被称为“return”。
什么是算法?首先,你只需要知道算法实际上是一段对特定数据进行操作的代码。你也可以把它看作是解决问题时所采取的方法和步骤的总称。对于基本的C程序来说,其实是由数据和算法组成的。
什么是“数据结构”?如果想系统的讲解,需要一本《数据结构》的书。简单来说就是程序要处理的数据在内存中存储和组织的方式,分为物理结构和逻辑结构。逻辑结构是我们抽象后得到的大脑图像。
什么是“函数库”?它们以文件的形式存储,文件是一组预定义的函数,我们的程序可以直接调用它们。当然,前提是要包含它的头文件(库函数的原型声明)。这些函数被组合成。在静态连接过程中。Windows中还有一个库,叫做动态连接库(DLL)。
GUI:也就是“图形用户界面”,也就是我们在Windows上看到的。它以菜单栏、滚动条和窗口的形式存在于显示区域。
GDI:图形设备接口,从程序员的角度来说,GDI实际上是由数百个函数、数据形式和一些相关的数据结构组成的。
学习C语言的全过程:
仔细想想。其实学习C语言,首先要学习C语言的基本语法,也就是学习C语言的组成部分。一部分一部分学。知识要一点一点巩固。我假设你学C语言是看《C程序设计》的。我觉得你应该先仔细看看C编程。这样你应该能对整本书和C语言的整体结构有一个大致清晰的了解。不要以为学习就是看一本书。你应该学会记笔记。在记笔记的过程中,你其实是在学习,从分析、理解、总结知识,到用自己的思维方式写下来。整个过程就是把书上的知识抽象到自己的脑袋里。个人感觉学习效果很好。不懂就问。多和别人交流,多思考,遇到问题多思考。你真的找不出问题在哪里。现在就问别人,不懂就不要直接问别人。那对你没多大好处。其实你要学会安排一个适合自己的学习计划。我粗略估计了一下,如果你能每天安静地花4个小时,认真学习,30天内应该就能掌握C语言了。其实你大部分学习时间都在看书,而不是对着电脑。在调试你的代码之前,把核心代码写在纸上,分析一下:程序的模块(可以是一个函数,也可以是多个函数)是由几个函数实现的,接口是封装的。哪种数据结构更合适?关键在于算法。在发布最终程序之前,最好尽量减少代码行数。不要只想着多写代码。太多的代码是程序的负担。你可以在网上下载一个文件(chm,C语言的经典例子),里面大概有上百个经典例子。每个例子都是C语言一部分的典型应用。花时间研究这个文件中的所有示例代码,你最好自己改进代码。用自己的方式解决。以后你会发现,你在写一些应用的时候,经常会有一些算法。会涉及到我之前提到的例子。最后,我觉得可以自己写C语言标准函数,比如strcpy();strlen();strcat();最好不要太依赖库函数。
学习C语言的难点:
现在我应该讲一个关键环节。很多网友说学C语言难,我觉得C的某些部分更复杂,更难理解。当然,等你有了丰富的开发经验之后,这就不再是问题了。下面,我将亲自讲解一下我认为学习c时难学的地方,如不正确,请指出:
指针的外观:
我觉得很多初学者学习指针这一章是很难的,我就用自己的思路来解释一下指针这种特殊的数据类型。
基本变量对大家来说可能不难理解,因为基本变量里面存储了同类型的常数。其实指针也是一个变量。但是,这个变量与基本变量有一点不同。然后你问:有什么区别?我告诉你,简单理解,普通变量其实存储的是同类型的常量,而指针变量存储的是“同类型变量的第一个地址”。你能理解这个吗?很简单的解释,却不失本质。这是事实。如果你不理解“同类型变量的首地址”,我可以给你一个生动的描述:
浮动变量;//声明单精度实数类型的变量。
此时,编译器已经给变量分配了内存空间,结构如下:
__________
| |1001
| -
| |1002
| -
| |1003
| -
| |1004
| -
这就是变量的存储结构。位16下的浮点占用4个字节,内存地址线性编码。我们不难看出,Variable的第一个地址就是他的第一个单元格的地址,1001。好,继续往下看:
浮点*指针= & amp可变;//声明一个指向变量的指针。
_________
|1001 |这是指针的内存结构。
|_______|
我们的程序可以这样执行:
变量= 1.0;
直接给变量赋值叫做直接访问。
您也可以这样做:
*指针= 1.0;
也可以通过指针变量赋值。前面的*是一个间接运算符号,意思是寻找指针内部存储地址标识的内存单元,也就是变量。此时,通过间接访问实现分配。可以这样描述:
_ _ _ _ _ _ _(指向变量)_ _ _ _ _ _ _ _
|指针|-& gt;可变的
- -
以上应该是指针实现的基本说明。很多优秀的程序员都说指针是C语言的精髓。的确,很多优秀的程序员在编写程序的时候非常依赖指针,因为它很方便。其实指针访问的对象是无限的,前提是我们知道内存地址。所以指针是不安全的,开发网络程序的时候尽量少用指针。让我们来看看数组中的指针。
数组中的指针:
简单解释一下数组,数组结构在C中应用广泛,其实最常用的数组是char类型,主要用于字符串操作。实际上,数组是“同类型变量的有限集合”。我觉得这个应该很好理解。该阵列占用存储器中的连续存储单元(具有连续地址)来存储阵列中的每个元素。该阵列是具有指定长度的预先分配的存储单元。对于数组元素。它不支持动态内存分配。为了唯一地确定内存中的数组,需要两个标识符:入口地址(函数名)和结束标记(“\0”)。有些语言不支持C之类的字符串的结束标记,所以它们必须声明另一个变量来标识结束元素的下标。这个数组名实际上是这组存储单元的第一个单元。他的地址是整个数组的入口地址。这个时候要明白数组名是指针,理解起来没有问题。确实在具体操作过程中不允许改变数组名的地址,也不符合实际要求。因此,我们可以理解数组名是const指针(指针常数)。我们可以这样做:
int数组[10];
int *指针;
指针=数组;
for(I = 0;我& lt10;++i)
指针= = I;
上面的代码应该没问题。相同类型的指针对于数组名的任务是完全合格的。完全没有问题,可以很好的运行。当然,我们可以进一步编写这样的代码:
保持
for(I = 0;我& lt10;++i)
指针= I;
换成
for(I = 0;我& lt10;++i,指针++)
*指针= I;
抱歉,我记不清了,指针++操作是地址+1还是后移一个元素的位置。如果是地址+1,上面的代码将改为:
for(I = 0;我& lt10;++i,指针+sizeof(int))
*指针= I;
如果数组类型是char,会更方便,因为字符串在结束元素后面有一个结束标记(' \0 ')。下面是一个简单的代码,使用了char指针:
char * my_strcpy(char * dst,const char * src)
{
char * cp = dst
while(* cp++ = * src++);//注意运算符的优先级和组合。
返回(夏令时);//返回新传递的指针。
}
上面的代码实现了转移字符进行复制的功能。代码不是很简洁吗?如果不需要移动内存块,完全可以通过交换指针(内存地址)来实现排序操作,其效率应该是非常客观的。Add:确保指针本身和指针所指向的变量不是一个单元。