c语言入门自学零基础笔记(c语言自学入门教程)
(OC 初级笔记)OC 常用数学函数(C语言)
1.算数函数
1.1产生随机数
rand()
1.2取绝对值
fabs()
1.3取复数的绝对值
cabs(struct complex i)
1.4浮点数的绝对值
fabs()/fabsf()/fabsl()
1.5取余
fmod(double, double)
1.6向上取整
ceil()/ceilf()/ceill()
1.7向下取整
floor()/floorf()/floorl()
1.8求最大值
fmax()/fmaxf()/fmaxl()
1.9求最小值
fmin()/fminf()/fminl()
1.10四舍五入
round()/roundf()/roundl()
2.指数与对数
2.1求 n 的 m 次方的值
pow(n, m)/powf(n, m)/powl(n, m)
2.2求 e 的 x 次方
exp(x)/expf(x)/expl(x)
2.3以 e 为底的对数值
log()/logf()/logl()
2.4以10为底的对数
log10()/log10f()/log10l()
2.5开平方(根号)
sqrt()
3.三角函数
3.1正弦值
sin()/sinf()/sinl()
3.2余弦值
cons()/cosf()/cosl()
3.3正切值
tan()/tanf()/tanl()
3.4双曲线正弦值
sinh()/sinhf()/sinhl()
3.5双曲线余弦值
cosh()/coshf()/coshl()
3.4双曲线正切值
tanh()/tanhf()/tanhl()
4.反三角函数
4.1反正弦值
asin()/asinf()/asinl()
4.2反余弦值
acos()/acosf()/acosl()
4.3反正切值
atan()/atanf()/atanl()
4.4反双曲线正弦值
asinh()/asinhf()/asinhl()
4.5反双曲线余弦值
acosh()/acoshf()/acoshl()
4.6反双曲线正切值
atanh()/atanhf()/atanhl()
求c语言的详细教程
推荐:
1.C语言编程宝典
2.C In China
3.百度C语言吧
4.编程中国
5.C语言之家
6.C语言基地
c语言基地 有名校教师 视频 教学
我认为要学好C语言首先必须了解等级考试C语言的大纲和内容,以及各种辅助材料的用途,这是学好C的基础。从以前的经验以及考网上的一些信息可知,要自学C语言必须准备以下资料:
1、 教材:大家现在都公认是清华大学谭浩强主编的那本,当然有其他的也可以,如高校出版社的。
2、 习题集:我认为清华大学的《C语言样题汇编》不错。书后面附有答案。
3、 上机练习:我认为南开大学的那个可以,最好是在考前从头到尾做一遍。答案可以去考网下载区下载。
4、 大纲:这个肯定要的,可以在考网二级版那里去下,然后打印出来。
5、 自学计划:为了做到有计划有目的地学习C语言,大家可以根据自己的学习(或工作)情况,制定一个自学计划,循序渐进地学习。
6、 模拟盘:为了更好地熟悉考场环境,下一个模拟盘是必不可少的,可以在。下载,注意,在下载时要把锁匙盘一起下回来,否则不能进入考试环境。
7、 教学光盘:如果能买到C语言的教学光盘,那当然更好,这样可以更直观地学习C语言了。
下面从微观上针对C语言的几个重点和难点,逐个谈谈具体的自学方法。
二 如何学习C语言的运算符和运算顺序
C语言的运算功能十分丰富,运算种类远多于其它程序设计语言。因此,当多种不同运算组成一个运算表达式,即一个运算式中出现多种运算符时,运算的优先顺序和结合规则显得十分重要。
初学者往往对此感到非常困难,觉得C语言学习太繁杂,其实只要我们对此合理进行分类,找出它们与我们在数学中所学到运算之间的不同点之后,记住这些运算也就不困难了,有些运算符在理解后更会牢记心中,将来用起来得心应手,而有些可暂时放弃不记,等用到时再记不迟。
下面是所有的运算符按优先级不同分类列表:(对不起,因为表格显示不正常,已被我删除大家可以看书上的)
表中列出15种优先级的运算符,从高到低,优先级为1 ~ 15,最后边一栏是结合规则,除第2、3级和第14级为从右至左结合外,其它都是从左至右结合,它决定同级运算符的运算顺序。
下面我们通过几个例子来说明:
(1) 3*20/4%10 这个表达式中出现3种运算符,是同级运算符,运算顺序按从左至右结合,因此先计算3 * 20=60,然后被4除,结果为15,最后是%(求余数)运算,所以表达式的最终结果为15%10 = 5
(2)a = 3;b = 5;c =++ a* b ;d =a + +* b;
例子中的“;”是C语言的语句分隔符,执行顺序为从左到右,第1条语句执行后a的值为3,第2条语句执行后b的值为5,第3条语句中有两个运算符前置+ +和*,按表中所列顺序,+ +先执行,*后执行,所以+ + a执行后,a的值为4,由于+ +为前置运算,所以a的值4参与运算,C的值为20,最后执行第4条语句,由于a + +为后置运算,所以a值为4参与运算,使得d的值仍为20,而a参与运算后其值加1,值为5。
这个例子执行后,a的值为5,b的值为5,c的值为20,d的值也是20。
(3)a = 3,b = 5,b+ = a,c = b* 5
例子中的“,”是逗号结合运算,上式称为逗号表达式,自左向右结合,最后一个表达式的结果值就是逗号表达式的结果,所以上面的逗号表达式结果为40,a的值为3,b的值为8,c的值为40。
三、如何学习C语言的四种程序结构
(1)顺序结构
这种结构的程序比较简单,就是按照语句的排列顺序依次执行的机制。顺序结构的执行顺序是自上而下,依次执行,因此编写程序也必须遵守这一规定,否则你的程序执行结果就不对。
例如;a = 3,b = 5,现交换a,b的值,正确的程序为:
c = a;
a = b;
b = c;
执行结果是a = 5,b = c = 3如果改变其顺序,写成:
a = b;
c = a;
b = c;
则执行结果就变成a = b = c = 5,不能达到预期的目的,这是初学者常犯的错误。
顺序结构可以独立使用构成一个简单的完整程序,常见的输入、计算,输出三步曲的程序就是顺序结构,例如计算圆的面积,其程序的语句顺序就是输入圆的半径R,计算S = 3.14159*R*R,输出圆的面积S。而大多数情况下顺序结构都是作为程序的一部分,与其它结构一起构成一个复杂的程序,例如分支结构中的块体、循环结构中的循环体等。
C语言自学方法(2)
(2) 分支结构
分支结构与顺序结构不同,其执行是依据一定的条件选择执行路径,而不是严格按照语句出现的物理顺序。分支结构的程序设计方法的关键在于构造合适的分支条件和分析程序流程,根据不同的程序流程选择适当的分支语句。
分支结构适合于带有逻辑条件判断的计算,设计这类程序时往往都要先绘制其程序流程图,然后根据程序流程写出源程序,这样做把程序设计分析与语言分开,使得问题简单化,易于理解。程序流程图是根据解题分析所绘制的程序执行流程图。
学习分支结构不要被分支嵌套所迷惑,只要弄清基本的分支结构,嵌套结构也就不难了。嵌套只不过是分支块体中又包括分支语句而已,不是新知识,只要你基础知识扎实,分支嵌套也难不住你,下面我们重点讨论几种基本的分支结构的学习方法。
①If(条件)
{
块
}
这种分支结构中的块可以是一条语句,此时“{
}”可以省略,也可以是多条语句。它有两条分支路径可选,一条是条件为真,执行块,另一条是条件不满足,跳过块。
如,计算x的绝对值,根据绝对值定义,我们知道,当x=0时,其绝对值不变,而x0时其绝对值是为x的反号,因此程序段为:if(x0)
x=-x;
②if(条件)
else
这是典型的分支结构,如果条件成立,执行块1,否则执行块2,块1和块2都有1条或若干条语句构成。
如:求ax^2+bx+c=0的根
分析:因为当b^2-4ac=0时,方程有两个实根,否则(b^2-4ac0)有两个共轭复根。其程序段如下:
d=b*b-4*a*c;
if(d=0)
{x1=(-b+sqrt(d))/2a;
x1=(-b-sqrt(d))/2a;
printf(“x1=%8.4f,x2=%8.4f\n”,x1,x2);
}
else
{r=-b/(2*a);
i =sqrt(-d)/(2*a);
printf(“x1=%8.4f+%8.4fi\n”r, i);
printf(“x2=%8.4f-%8.4fi\n”r,i)
}
③多路分支:其语句格式为:
if(条件1) ;
else if(条件2)
else if(条件3)
……
else if(条件n)
else
④switch语句:
switch
语句也是多分支选择语句,又称为多路开关语句,到底执行哪一块,取决于开关设置,也就是表达式的值与常量表达式相匹配的那一路,它不同if—else 语句,它的所有分支都是并列的,程序执行时,由第一分支开始查找,如果相匹配,执行其后的块,接着执行第2分支,第3分支……的块,直到遇到break语句;如果不匹配,查找下一个分支是否匹配。
(3)循环结构:
循环结构可以减少源程序重复书写的工作量,用来描述重复执行某段算法的问题,这是程序设计中最能发挥计算机特长的程序结构,C语言中提供四种循环,即goto循环、while循环、do –while循环和for循环。
四种循环可以用来处理同一问题,一般情况下它们可以互相代替换,但一般不提昌用goto循环,所以下面我们重点讲解另外的三种循环。
常用的三种循环结构学习的重点在于弄清它们相同与不同之处,以便在不同场合下使用,大家好好看一下书中三种循环的格式和执行顺序,如何替换使用,如把while循环的例题,用for语句重新编写一个程序,这样能更好地理解它们的作用。
注意:在while和do—while循环体内和for
循环中的第3语句中,应包含趋于结束的语句(如I++,I--),否则就可能成了一个死循环,这也是初学者的一个常见错误。
下面我们来讨论下这三种循环的异同之处:
用while和do—while循环时,循环变量的初始化的操作应在循环体之前,而for循环是在语句1中进行的;while
循环和for循环都是先判断表达式,后执行循环体,而do—while循环是先执行循环体后判断表达式,也就是说do—while的循环体最少被执行一次,而while
循环和for就不一定了。这三种循环都可以用break语句跳出循环,用continue语句结束本次循环,而goto语句与if构成的循环,不能用break和
continue语句进行控制。
这三种结构并不是彼此孤立的,在循环中可能出现分支、顺序结构,分支中也可能出现循环、顺序结构而把循环、分支看成一个语句,它又是构成顺序结构的一个元素,因此这三种结构相互结合,就能实现各种算法,设计出解题程序,但若是很大的题目,这样编出的程序往往很长,重复结构多,并且可阅读性差,因此我们常将C程序设计成模块化结构。
(4)模块化程序结构
C语言的模块化程序结构用函数来实现,即将复杂的C程序分为若干模块,每个模块都编写成一个合法的C函数,然后用主函数调用函数及函数调用函数实现一大C程序:C程序=主函(main)+若干个函数。
在程序设计中,常将一些常用的功能模块写成函数,也可以将大程序段分割成若干函数,前者目的在于减少重复编写程序段的工作量,后者目的在于缩短模块长度,以便程序阅读方便。
一个源程序文件由一个或多个函数组成,它是一个编译单位,而一个C程序由一个或多个源程序文件组成。对较大的程序,往往分成多个文件,这样可以分别编写、分别编译,提高高调试效率,一个源程序文件可以被多个C程序公用。
C程序的的执行是从main()函数开始,调用其它函数后流程回到main函数,在main中结束整个函数运行,main函数的称是系统规定的,用户可以修改其内容即函数体,但不能修改其名称和参数,一个C程序必须有一个main函数,也只能有一个main函数。
所有函数都是平行的,即在定义函数时是互相独立的一个函数度不从属于另一个函数,即函数不能嵌套定义,但可以互相调用,但不能调用main函数。
函数分成两类,即标准函数和用户自定义函数,标准函数又称库函数,由系统提供,用户可直接调用,C语言提供了丰富的库函数,请考生在编写C程序时查阅教材后的函数说明,这可节省你的编程工作量;用户自定义函数由编程者自己编写.
回答者:阿拉蕾啊呀 - 试用期 一级 7-23 11:13
提问者对于答案的评价:
太好了,非常感谢!
评价已经被关闭 目前有 1 个人评价
好
100% (1) 不好
0% (0)
对最佳答案的评论
19798802 C语言新手群快加入吧!!!!!!1
评论者: 549045259 - 见习魔法师 二级
浮躁的人容易问:我到底该学什么;----别问,学就对了;浮躁的人容易说:我要中文版!我英文不行!----不行?学呀!浮躁的人分两种:只观望而不学的人;只学而不坚持的人;浮躁的人永远不是一个高手。
评论者: hnytgl - 试用期 一级
其他回答共 4 条
1.读代码!
2.改代码!
3.写代码!
回答者:liuding1213 - 见习魔法师 二级 7-18 21:10
找一本经典教材,例如谭浩强的《C语言陈序设计》。
找一本习题集,要有全部详细解释的那种,最好有实例的代码答案。
花一个月把课本看完,务求理解。不理解的地方也不要死抠,做上标记等以后再解决。然后开始做题,不要因为题目简单就放过,往往简单背后蕴藏大的发现。也可以快速看完书,然后复习,每复习完一章后把习题集上的题目好好做一遍。
做题时最好在计算机上把不明白的地方亲自实践一下,然后在笔记本上写下自己的感想和心得。考试前翻一翻笔记即可。
千里之行始于足下,行动吧!
C语言要背哪些?
main函数和其他函数;头文件,数据说明等。
考试要求熟悉Visual C++2010 Express集成开发环境;掌握结构化程序设计的方法,具有良好的程序设计风格;掌握程序设计中简单的数据结构和算法并能阅读简单的程序;在Visual C++2010 Express集成环境下,能够编写简单的C程序,并具有基本的纠错和调试程序的能力。
要求学习程序的构成,main函数和其他函数;头文件,数据说明,函数的开始和结束标志以及程序中的注释;源程序的书写格式;C语言的风格;C的数据类型(基本类型,构造类型,指针类型,无值类型)及其定义方法;C运算符的种类、运算优先级和结合性;不同类型数据间的转换与运算。
扩展资料:
二级C语言考试的相关要求规定:
1、其中3月份和9月份考试开考全部级别全部科目,12月份考试开考一、二级的全部科目。各省级承办机构可根据实际情况决定是否开考12月份考试。
2、教育部考试中心确定从2013年上半年开始,实施无纸化的NCRE,二级6个科目是:二级C、二级VB、二级VFP、二级JAVA、二级ACCESS、二级C++。取消“Delphi语言程序设计”科目(代码:62)。
3、考生不受年龄、职业、学历等背景的限制,任何人均可根据自己学习和使用计算机的实际情况报考。每次考试报名的具体时间由各省(自治区、直辖市)级承办机构规定。考生按照有关规定到就近考点报名。
参考资料来源:百度百科-二级C语言
C语言怎么学?
浅谈C语言学习方法
本人是一名windows程序写作员,使用的语言是C语言.其他语言了解一点点,但并不擅长.可能对于初学者来说,首先就是选择一门程序设计语言.当然,今天我将要说的不是这方面.每种语言都有它所擅长的领域与层面.当然对于其他非C语言我是一名门外汗,我也不会站在C语言的立场去谈论其他任何一门语言.好了,在开始进入正题之前,我想谈谈个人对C的一些看法:
C语言是一种早期的计算机语言,最初诞生目的是为了提供一种基于UNIX系统的工作语言.但是,后来却被越来越多的人发现它的优点与潜力.C本身比较接近底层,适合开发系统软件甚至是操作系统.我个人也认为它是界于高级语言与汇编语言之间的中级语言.C语言是一门结构化语言(我认为主要是指它的控制结构如:if if-else while for等等).C程序设计上有提到"自顶向下,逐步深入".以函数为原子功能模块.对于大型的程序来说模块化是很重要的,有一句话说的很好"优质的程序首先就是便与人们之间的相互讨论与交流,其次才是执行效率".当然我个人认为任何一名程序写作者,都应该养成一种特定的思维方式,以程序的思维方式来思考程序的实现.前提就是要足够的来了解计算机底层技术.要不我想就连学习都是很困难的,凡事都是一个思路的问题嘛.标准的来衡量,C应该算是高级语言阵营的一份子.可很多有C语言开发经验的程序写作者.通常亲切的称C为界于底级语言与高级语言之间的中级计算机语言.当然不是因为C比高级语言要差,之所以这么认为是因为C既具有高级语言的结构化与可理解性又具有低级语言的高效率.同时C的移植性也是非常不错的,大家应该知道,越是接近硬件,接近底层的语言就越加的依赖硬件环境,也就是我们所说的设备相关性.C这一点做的是非常棒的.说了这些,在从另一个角度去分析C语言.当然每种语言都有它自身的优缺点,C也一样.比如在现在高级语言与顶层技术的角度来看的话,C最大的缺陷就是Data与算法的分离.举一个例子: 对于一个拥有几千行甚至上万行Code的程序来说,如果修改Data,比如我在Structure中增加一个字段,可能为此我的整个程序都要改动,这使得程序的可重用性大大降低.开发周期也大大的延长.但是在底层的角度来看这也正是C的优点.我为什么要这么说呢?我个人认为在求解与实现一个小问题的时候,我们可以写出一个通用的模块处理不同的Data.当然比如某些经常用到的,基于数据结构的一些常用算法我们可以写出来在开发的时候我们可以直接把预先编写的模块插入到我们的程序中去,这不也是大大低了开发周期吗?初学者完全可以根据自己的需求来编写一个自定义库.好了,说了这些,有些地方我理解错了,还请各位指出来,交流是很重要的,前提是要把自己的心态放平.下面我将谈论本问的重点,也就是如何来学习C语言,是给那些初学者读的.
正题部分:
有人可能会说:学习还用你教啊,谁没上过学啊.其实我今天要说的只是,站在一个过来人的角度,来分析与解释学习C语言的过程中比较困难的地方.当然我个人也会对比较具体的问题进行解释(个人看法).我一直在强调个人看法,我是想让大家明白,对于同一个问题大家可能都很难达成统一的意见,希望批评的时候客气点就好喽!
初学者该看哪些书来入门:
在学习C语言之前,首先就要选择一本教材,对于初学者,我个人并不建议去读电子书籍,最好是买纸质书来学习.比如比较有名的"C程序设计"就很不错,尤其是第二版.我也看过,比较适合中国人来初学.整本书都在全面系统的讲解C的语法结构,构成C的语言元素包括:数据类型,支持的运算符,标识符(是由程序员按照命名规则起的名字,用于变量名,函数名,宏名等等),关键字(编译系统用于实现C内部功能的词,比如:转向goto和中断break等等)等.看完这本书你基本上可以写一些简单的小程序,当然是DOS下的程序.如果你想在进一步深入学习C的话,可以看"C陷阱与缺陷"这本书.写这本书的作者是在Bell工作对C是非常精通的,应该算是大师级的人物了.如果你暂时不想深入C的话,也没问题,因为此时你完全可以把C当作一种编程工具来使用,你要做的就是多写Code来让自己熟悉C语言.经验是非常重要的,"经验是检验真理的唯一方法".当然你不会纸上谈兵,如果你有过多的开发经验的话,就知道在纸上或最初的设想的Code拿到计算机上来实现,最终会发现有很多地方都是不合理的,之前是没有办法想象到的.在初学C的过程中,比如你会看"C程序设计"来初学C,当你学完每一章的时候要把习题来完成,这里就是考验你学到的知识了,看看你应用能力怎么样?尤其是程序设计题目,比较有意思.哪里不懂了.可以翻回去看书中的解释.如果没有解释或你还是不明白,可以去问别人,与其他人交流. bbs,QQ或Google.直到你弄明白为止.当你把问题最终解决的时候,我敢打赌,此时你一定很兴奋,或者是比较兴奋.这个时候知识已经在你的大脑里了.
下面我为你推荐几本不错的关于C语言籍:
C编程规范
C语言大全第四版 (个人感觉不错,里面有提及C标准方面的东西)
C和指针
The C programming Language (经典著作)
如果你要看电子书的话,以上几本书在Google上很容易就可以找到.
关于C语言的初步理解:
对于初学者,会有太多的疑问,原因是你的知识面太小.现在我为你解释一些C相关的东西.目的是让你能够有一个大致清晰的方向,来给自己安排学习计划.专业的来说,我们是或将是一名程序员,程序员当然就是要开发程序了.对于软件开发方面我来解释下术语:
C,C++,ASM,Basic,Java 这些是计算机语言.计算机语言很多,我就不多说了.
Visual C++,Visual Basic, Microsoft研发的开发环境,开发环境包括:编译器,库函数(每种C语言编译器都支持标准库,同时它们也会扩展自己的库,所以很多比较以来库函数实现的程序员,在转向不同的开发环境的时候最初总是不使用的,会遇到很多问题),一些资源模板等等.Visual 就是可视的意思,后面的就是语言.Visual C++支持C与C++2种语言,是根据文件的扩展名来判断采用哪种编译内核.
什么是"面向对象"与"面向过程"? 其实是2种完全不同的程序设计思想,C语言是面向过程语言,而C++是面向对象语言.在面向对象的语言中有"类(Class)"这个东西.C中没有.对象是由类来派生的一个实例,相反类就象是一个模板.
什么是SDK? SDK就是软件开发工具包(Software Development Kit).指的范围比较广,通俗的说,凡是能够与软件开发过程占上边的东西都属于.比如:库文件,参考资料,接口函数,当然语言也应该属于.
DDK就是设备驱动程序开发工具包.
Turbo C: 这是一个比较精致的C语言编译器.
理论上来说任何一门语言都可以在任何一种操作系统上运行,前提是操作系统要支持.也就是我们所说的应用程序接口,比如Window API(Application Programming Interface),其实是Microsoft内部定义的接口函数用于实现一些Windows内部的功能.一些对象的描述术语,在不同平台上是不同的,比如:Windows下的"调用",经常被称为"呼叫","返回"被称为"传回".
什么是"算法"? 你最初只需要知道算法实际上就是对特定的Data进行运算的一段代码而已.也可以认为在求解一道题目的时候,采取的方法与步骤的总称.对于基本的C程序来说,实际上就是由Data与算法来组成的.
什么是"数据结构"? 如果要是系统的讲解,还需要一本书"数据结构",简单的说:是程序要处理的数据在内存中的存储与组织的方式,分为:物理结构与逻辑结构.逻辑结构就是我们抽象化以后得到的大脑影象.
什么是"函数库"? 它们以文件的形式存储,是预先定义好的函数的集合,我们的程序可以直接调用.当然前提是要包含它的头文件(库函数的原型声明).这些函数是在静态连接期间组成到.exe文件中去的.Windows又存在另一种库,叫做动态连接库(DLL).
GUI: 也就是"图形用户界面",就是我们在Windows上看到的,存在:菜单栏,滚动条与显示区域的窗口.
GDI: 图形设备接口,从程序写作者的角度来看,其实GDI就是由上百个函数与数据形态和一些相关的数据结构所组成的.
学习C语言的全过程:
仔细想想,实际上学习C语言,最初是应该先学习C语言的基础语法.也就是学习C语言的组成部分.一部分一部分的向下学.知识要一点一点的巩固的.本人假设你学习C语言是看"C程序设计".我认为你应该先把C程序设计仔细的看一便,这样你应该可以对整本书和C语言的整体组成结构有个大致的清晰了解.不要认为学习只是在看书,看一便就可以了.你应该学会记笔记,在记笔记的过程中,其实你就是在学习,从知识的分析,理解,归纳,到最后以自己的思维方式记下来,这整个过程就是把书中的知识抽象到你自己的脑袋里.个人感觉学习效果非常好,不懂就问,要多多与人交流,要多思考,遇到问题自己先多想想,实在找不到问题出在哪,在去请教别人,不要有不懂的地方就直接去问别人,那样对你没太大的好处.其实要学会给自己安排适合自己的学习计划,我大致来估计了一下,如果你每天能花4个小时安静的,用心去学习的话,30天之内你应该可以掌握C语言了.其实在整个学习过程中你大多数时间都在看书,而不是面对电脑.在调试你的代码之前,先在纸上把核心代码大致写出来,分析一下:程序的组成模块(可以是一个函数或多个),由几个函数来实现,接口的封装.采用哪种数据结构更适合一些.关键在于算法.在你的最终程序发布之前,最好把你的代码行数减到最少.不要只想着把代码写多.过多的代码对程序来说是负担.你可以在Internet上下载一个文件(C语言经典例题.chm),里面大致包含了上百个经典的例题.每一个例题都是C语言某部分的典型应用.花时间把这个文件中的所有例题代码研究一下,最好能自己把代码改善,以自己的方式来求解.以后你会发现你在写一些应用程序的时候经常会有一些算法.会涉及到我之前提到的例题.最后我认为你可以自己来写C语言标准函数,比如strcpy(); strlen();strcat();最好不要过分依赖库函数.
C语言学习的难点:
现在应该是已经讲到一个重点的环节.很多网友都说学习C语言很难,我认为C中有些部分是比较复杂,难理解的.当然在你具有了丰富的开发经验以后,这以不在是问题了.下面我个人会对我认为学习C的时候比较难学的地方进行我自己的阐述,如果哪里不正确,还请各位指出:
指针的出现:
我想有很多初学者学习到指针那一章都感觉很难,下面我就以自己的想法来解释下指针这个特殊的数据类型,
基本变量大家可能并不难理解,因为基本变量其内部存储了同类型的常量,事实上指针也是变量,不过呢,这个变量和基本变量有点不一样,那你又问了:是哪里不一样呢? 我告诉你,简单的来理解其实普通的变量内部存储了同类型的常量,而指针变量内部存储的则是"同类型变量的首地址".这样你能够理解吗,是很简单的解释,但不失本质.事实就是这样的.如果你不理解"同类型变量的首地址"的话,我可以给你形象的来描述一下:
float Variable; //声明一个单精度实型的变量
此时,编译器已经给Variable分配了内存空间,结构如下:
__________
| |1001
|---------
| |1002
|---------
| |1003
|---------
| |1004
|---------
以上便是Variable的内存结构了,16位下的float占用4个字节,内存地址是线性编码的,我们可以很容易的看出Variable的首地址就是他第一个单元的地址1001,好的,继续向下看:
float *Pointer=Variable; //声明一个指向Variable的指针Pointer
_________
|1001 | 这是Pointer的内存结构
|_______|
我们的程序可以这样来执行:
Variable=1.0;
直接给Variable赋值,我们称为直接访问.
也可以这样执行:
*Pointer=1.0;
也可以通过指针变量来赋值,前面的*是间接运算符号,意思是求Pointer内部存储地址所标识的内存单元.也就是Variable.此时,是赋值是通过间接访问来实现的.可以这样形象的描述:
________ (指向Variable) __________
|Pointer|------------------------------------|Variable|
--------- ----------
以上应该是指针实现的基本解释,很多优秀的程序写作者都说指针是C语言中的精华,的确如此,很多优秀的程序写作者写程序都非常依赖指针,因为它很方便,实际上指针所访问的对象是没有限制的,他可以指向任何类型的变量,前提是只要我们知道内存地址.因此指针也并不安全,在开发网络程序的时候,尽量要少使用指针.下面我们在来看一下指针在数组中的使用.
数组中的指针:
简单的来解释下数组,数组结构在C中使用比较普遍,其实最常用的就是char 类型的数组,主要是用于字符串操作.实际上数组是"同类型变量的有限集合".我想这应该不难理解吧.数组在内存中占用连续的内存单元(地址连续),来存储数组中的每一个元素.数组是预先分配好指定长度的内存单元,供数组元素使用.它并不支持动态内存分配.在内存中想要唯一的确定数组,需要2个标识:入口地址(函数名)和结束标记('\0').有些语言并不向C语言这样支持字符串结束标记,它们必须要另外声明一个变量来标识尾元素的下标.那数组名其实就是这一组内存单元的首单元,他的地址就是整个数组的入口地址.此时应该明白了,数组名是一个指针,这样理解没有问题.不错在具体操作的时候不允改变数组名的地址,也不符合实际要求.这样就可以明白数组名是一个什么 const Pointer(指针常量).我们可以这样做:
int Array[10];
int *Pointer;
Pointer=Array;
for(i=0;i10;++i)
Pointer==i;
以上代码应该是没问题吧,同类型的指针,完全可以胜任数组名的任务.一点问题没有而且可以运行的很好.当然,我们可以进一步把代码这样来写:
把
for(i=0;i10;++i)
Pointer=i;
改成
for(i=0;i10;++i,Pointer++)
*Pointer=i;
不好意思,我记不清了,指针的++运算是地址+1还是向后移动一个元素的位置,如果是地址+1的话,以上代码在改成这样:
for(i=0;i10;++i,Pointer+sizeof(int))
*Pointer=i;
如果数组类型是char的话,那就更方便了,因为字符串存存在一个在尾元素之后的结束标记('\0'),下面给出一个简单的代码,应用char Pointer:
char * my_strcpy(char * dst, const char * src)
{
char * cp = dst;
while( *cp++ = *src++ ); // 注意运算符的优先级与结合性
return( dst ); //返回新传的指针
}
以上代码实现字符传Copy功能,代码是不是很简洁啊.如果不需要移动内存块的话,我们完全可以通过交换指针(内存地址)来实现排序操作,其效率应该是很客观的.补充一句:千万要弄清楚,指针本身与指针所指向的变量不是一个单元.
【C语言笔记】内部全局变量和外部全局变量
1.外部全局变量, 默认情况下所有的全局变量都是外部全局变量
什么事外部全局变量? 可以被其它文件访问的全局变量我们称之为外部全局变量
2.内部全局变量, 只要给全局变量加上static关键字就是内部全局变量
什么是内部全局变量? 只能被当前文件访问的全局变量我们称之为内部全局变量
可以定义同名的外部全局变量
多个同名的外部全局变量指向同一块存储空间
也可以定义多个同名的内部全局变量
多个同名的全局变量如果不在同一个文件中, 那么指向不同的存储空间
为了提高数据的安全性, 不让别人在其它文件中修改我们的全局变量, C语言提供了另外一个用于修改全局变量的关键字, static
只要用static修改的全局变量就是内部全局变量, 只能在当前文件中使用
这样就可以提高我们全局变量的安全性
如果多个文件中存在同名的内部全局变量, 相互不会影响
如果既有外部全局变量也有内部全局变量, 那么会优先访问内部全局变量
用于声明一个外部全局变量
声明只需要在使用变量之前声明就可以了
用于定义一个内部全局变量
声明和定义的区别:
声明不会开辟存储空间
定义会开辟存储空间