C/C++编程笔记:C语言编程知识要点总结!大一C语言知识点(全)
一、C语言程序的构成
与C++、Java相比,C语言其实很简单,但却非常重要。因为它是C++、Java的基础。不把C语言基础打扎实,很难成为程序员高手。
1、C语言的结构
先通过一个简单的例子,把C语言的基础打牢。
C语言的结构要掌握以下几点:
(1)C语言的注释是/* ··· */,而不是//···,//是C++的单行注释,有的C语言版本也认可。
(2)C语言区分大小写,每句以分号结尾。
(3)C语言程序是从main函数开始的。函数的返回值如果缺省则为int,而不是void。
(4)函数必须用return来返回。即使void类型也不建议省略。
(5)使用函数时须包含相应的头文件。自定义的头文件用双引号,C语言自身的头文件用<···>
2、main()函数的写法与含义
main()的参数和返回值全部省略,这和上例含义相同。省略写法是一种很不好的习惯。
main()的参数是一种不限个数的写法,argc代表参数的个数,真正的参数是放在argv[]数组里面的。注意:当数组当参数用时,数组被降格为指针。初学者先照着样子写,以后小雅会详细说明指针和数组的区别。
3、头文件的意义
每个C程序通常分为两个文件。一个文件用于保存程序的声明(declaration),称为头文件。另一个文件用于保存程序的实现(implementation),称为定义(definition)文件。
C程序的头文件以“.h”为后缀,C 程序的定义文件以“.c”为后缀。
头文件的内容也可以直接写C程序中,但这是很不好的习惯。许多初学者用了头文件,却不明其理。在此略作说明。
(1)通过头文件来调用库功能。在很多场合,源代码不便(或不准)向用户公布,只要向用户提供头文件和二进制的库即可。用户只需要按照头文件中的接口声明来调用库功 能,而不必关心接口怎么实现的。编译器会从库中提取相应的代码。
(2)头文件能加强类型安全检查。如果某个接口被实现或被使用时,其方式与头文件中 的声明不一致,编译器就会指出错误,这一简单的规则能大大减轻程序员调试、改错的 负担。
关于头文件的内容,初学者还必须注意。
(1)头文件中可以和C程序一样引用其它头文件,可以写预处理块,但不能写语句命令。
(2)可以申明函数,但不可以定义函数。
(3)可以申明常量,但不可以定义变量。
(4)可以“定义”一个宏函数。注意:宏函数很像函数,但却不是函数。其实还是一个申明。
(5)结构的定义、自定义数据类型一般也放在头文件中。
(6)#include <filename.h>,编译系统会到C语言固定目录去引用。#include \”filename.h\”,系统一般首先在当前目录查找,然后再去环境指定目录查找。
4、好的风格是成功的关键
版本声明、函数功能说明、注释等是C语言程序的一部分。不养成很好的习惯则不能成为C语言高手(专业人员)。
只有类型相同(或C语言能自动转换)的表达式才能比较,如果类型不同就必须用函数转换。例如:判断一字符串的长度是否等于10,就要用strlen()将字符串的长度求出来变成了整型,才能和10比较。
比较运算符只有6个,即:等于(==)、不等于(!=)、大于(>)、小于(<)、大于等于(>=)、小于等于(<=)。比较运算符也叫关系运算符。
逻辑运算符只有3个,即:与AND(&&)、或OR(||)、非NOT(!)。
位运算符只有6个,即:与AND(&)、或OR(|)、非NOT(~)、异或XOR(^)、左移ShiftLeft(<<)、右移ShiftRight(>>)。
三、数组
(1)数组名也是一变量名,定义时须指定类型和长度。
(2)长度可以方括号中直接指定,也可以通过赋值来间接指定。
(3)数组可以在定义时直接赋值,也可以定义时不赋值,之后再赋值。
(4)当使用超出范围的值时,编译不出错,但运行会出错。(上例运行时出错后,选“忽略”后得到的结果)
数组的地址
弄清数组地址对使用数组有很大好处,另外,有的函数的参数是指针(如scanf函数),如果要用数组的某一元素作参数,就必须知道其地址。
1.数组iArr是int类型,所以它的地址是按4字节递增。
2.数组cArr是char类型,所以它的地址是按1字节递增。
3.数组元素的地址是通过数组元素前面加“&”来取得。(如:&iArr[3])
4.数组名单独使用时,代表该数组的首地址。(iArr等同于&iArr[0])(注意:以后使用指针会经常用到这一点)
字符数组就是字符串吗?有人说是,因为书上这么写,教师也这么教的。小雅不敢说书上或教师们错了,但至少可以说许多初学者都混淆了这两个概念。因此,在这此将这2个概念再明确一下。
1.字符数组,完整地说叫字符类型的数组。字符数组不一定是字符串。
2.字符串是最后一个字符为NULL字符的字符数组。字符串一定是字符数组。
3.字符数组的长度是固定的,其中的任何一个字符都可以为NULL字符。
4.字符串只能以NULL结尾,其后的字符便不属于该字符串。
5.strlen()等字符串函数对字符串完全适用,对不是字符串的字符数组不适用。
从上面例子看来,还要注意以下几点:
(1)char sArr[] = \”quanxue\”;这种方式,编译时会自动在末尾增加一个NULL字符。
(2)NULL字符也就是\’\\0\’,在ASCII表中排在第一个,用16进制表示为0x00。
(3)sizeof()运算符求的是字符数组的长度,而不是字符串长度。
(4)strlen()函数求的是字符串长度,而不是字符数组。它不适用于字符串以外的类型。
(5)char sArr[] = \”quanxue\”;也可以写成char sArr[8] = \”quanxue\”;(注意:是8而不是7)
字符数组和字符串数组的转化
字符数组中插入一个NULL字符,NULL字符前面(包括NULL字符)就成了字符串,一般NULL字符插在有效字符的最后。
数组的输入输出『gets(),puts()』
getchar()和putchar()函数是单个字符的输入输出,gets()和puts()是字符串的输入输出,也是标准函数,在stdio.h中被定义。
五、指针
指针符号『*』和地址符号『&』
『&』符号是取变量的地址,『*』符号是取地址的内容(即:值)。两个操作正好相反。例如:“&i”就是取变量i的地址,“*(&i)”就是取“&i”这个地址的值,其实就是变量i。既然如此,为什么还要定义指针呢?原来,用『&』所取到的地址,自身只能用而不能修改。因此,直接把『&』取到的地址放到指针变量中去,既然指针变量也是变量,这个变量就可以任意存放其它地址。
指针变量的赋值和指针的赋值
上例中p是指针变量,*p是p的指针,p存放的是某个变量的地址,*p存放的是某个变量的值。当*p的内容改变时,p所指的变量的内容也发生改变,因为是同一个地址的存贮单元的值发生改变。同理,当p所指的变量的值发生改变时,*p的内容也随之改变。
被初始化的是指针变量还是指针
上面2例,指针变量都是用的p,初学者不要认为只能用p,既然是变量,只要不违反命名规则都可以。当指针变量被定义时立即赋值,这时被赋值的是指针变量还是指针呢?下面这段程序请大家千万注意!
(1)charstr[] =\”http://www.quanxue.cn/\”;中str是数组变量,当地址赋给point之后,point[11]就是str[11],所以其内容可以改变。
(2)char*ptr =\”http://www.51minge.com/\”;中赋值的性质和上面的str不同。这并不是将\”http://www.51minge.com/\”赋给*ptr指针,而是先定义一个常量\”http://www.51minge.com/\”,这个常量是定义在“栈”里面,然后将这个常量的地址赋给ptr,而不是*ptr。常量是不能被修改的,因此ptr[13]也就出错了。这是初学者经常犯的错误。
不赋值的指针和NULL
未赋值的指针变量是不能被使用的,其地址指向未不能使用的空间。建议定义时如果暂不使用,先赋NULL。为一个指针申请空间时,一定义要判断其是否为空,因为分配内存失败时返回NULL。不仅如此,甚至在使用指针时都应该判断一下是否为空。
六、指针、数组和字符串
一、数组和指针的关系
下面仍然是初学者容易搞错的地方。指针变量加n或减n,并不是地址加n或减n,而是当前所指的地址向后或向前跳n次所指的地址。
char型的指针数组相当于二维字符数组,并不等于说指针数组可以直接转化为二维字符数组,相反字符数组可以直接转化为指针数组。因为二维字符数组的地址是连续的,而指针数组所指的元素不一定连续(如下的m1、m2、m3的地址可以不连续,长度也可以不一样)。
三、指向指针的指针
在第一章讲main()函数的参数时,已经见过指针的指针,这和指针数组有相同的作用,但还是有细小的区别。指针数组可以在定义时直接初始化,而指向指针的指针不行。正如二维数组一样,不指定第二维长度不能直接初始化一样。即不能char str[][]={\”…\”, \”…\”, …}
四、指针的长度
让许多初学者遗憾的是,C语言没有提供数组长度的函数,但可以用sizeof()运算符先求数组的总长度,再求出数组类型的长度,二者相除便得到数组的长度。C语言更大的一个遗憾便是,sizeof()对指针变量求值时,结果总是4,这是因为指针变量的内容是地址,地址总是4个字节来表示。
因此有经验的编程人员,在用指针作参数时,一般总是同时多定义一个参数,来存放其长度。也就是指针和其长度同时传递过去。另外,数组长度如果事先知道,一般定义为常量。
七、为指针动态分配内存
C语言程序员要严防内存泄漏,这个“内存泄漏”就是由动态内存分配引起的。指针是C语言和其它语言的最大区别,也是很多人不能跨入C语言的一道门槛。既然指针是这么一个“危险”的坏东西,干吗不取消它呢?
其实指针本身并没有好坏,它只是一种操作地址的方法,学会了便可以发挥其它语言难以匹敌的功能,没学会的话,只能做其它语言的程序员,也同样发挥你的光和热。小雅本人也在C语言门外徘徊多年,至今仍属于初学者。
一、变量和数组可以通过指针来转换
“int*x”中的x究竟是不是数组?光看这一句小雅无法告诉你,因为它既可表示单个变量内容,也可表示数组。下面是小雅专门为你准备的例子,理解之后,对动态分配时长度计算有好处。
二、动态分配内存
前面讲到的指针,基本上将已经定义好的变量的地址赋给指针变量,现在要学的是向操作系统申请一块新的内存。申请到的内存,必须在某个地方手动释放,因此下面2个函数必须配对使用。malloc()和free(),都是标准函数,在stdlib.h中定义。
根据不同的电脑使用状况,申请内存有可能失败,失败时返回NULL,因此,动态申请内存时,一定要判断结果是否为空。malloc()的返回值类型是“void *”,因此,不要忘记类型转换。(许多人都省略了。)
三、隐蔽的内存泄漏
内存泄漏主要有以下几种情况:
(1)内存分配未成功,却使用了它。
(2)内存分配虽然成功,但是尚未初始化就引用它。
(3)内存分配成功并且已经初始化,但操作越过了内存的边界。
(4)忘记了释放内存,造成内存泄露。
(5)释放了内存却继续使用它。
下面的程序造成内存泄漏,想想错在何处?如何修改?
四、对动态内存的错误观念
有人对某一只在函数内使用的指针动态分配了内存,用完后不释放。其理由是:函数运行结束后,函数内的所有变量全部消亡。这是错误的。动态分配的内存是在“堆”里定义,并不随函数结束而消亡。
有人对某动态分配了内存的指针,用完后直接设置为NULL。其理由是:已经为NULL了,这就释放了。这也是错误的。指针可以任意赋值,而内存并没有释放;相反,内存释放后,指针也并不为NULL。
八、return和exit、assert的区别
return语句是结束当前函数。而exit是结束main()函数,即整个程序,一般都是在遇到非常错误时才调用exit()。assert()是一个宏定义,在assert.h中申明,用来在DEBUG方式诊断程序,当参数中的条件不成立时,中断main()函数。建议多多使用assert()。
九、变量和函数
在函数之外定义的变量是全局变量,在函数内定义的变量是这个函数的局部变量。局部就是只能在当前函数内使用,而全局变量可以在任何一个函数中使用。
注意:一般而言,全局变量总是在所有函数之前定义,但如果某全局变量定义在两个函数之间,则定义出后面的函数可以使用,而且前面函数不能使用。
有人说静态变量相当于全局变量,这句话其实不对。全局变量变成静态,就失去了静态的意义,因此,静态一般是加在局部变量上的。那么,究竟什么是静态的局部变量呢?静态变量随函数的定义而定义,如果已经存在就延用,但并不随函数的结束而消亡。在某一函数中定义的静态局部变量,不能在其它函数使用。
当很多人编写同一程序时,一般程序会被分割成几个文件。当几个人都定义了某一全局变量时,编译时不出错,Link时将出错。解决这个问题的办法:将其中一个定义原封不动,其余的定义前加上extend(即外部的定义)。
刚才所说是许多书上说的,小雅做了n次试验,证明上述编译时也不错,Link时也不错,也就是说extend完全是多余的。大概上面所说是几十年前的版本吧。事实上与extend同列在一起的还有auto、regist等变量修饰符。auto是区别B语言的,早就没用了,regist是将变量放到寄存器来运算,小雅认为基本没有这种需要。
拆成多个文件,多次定义全局变量时要注意:
(1)变量的数据类型要一致。
(2)有长度的数组和没定义长度的数组可以视为同一数据类型。
(3)数组和指针不能视为同一数据类型。
文章就分享到这里了,希望对大家有帮助!
原文链接:https://www.cnblogs.com/lisuyun/p/3974066.html
自学C/C++编程难度很大,不妨和一些志同道合的小伙伴一起学习成长!
C语言C++编程学习交流圈子,关注+私信【C/C++编程】微信公众号:C语言编程学习基地
有一些源码和资料分享,欢迎转行也学习编程的伙伴,和大家一起交流成长会比自己琢磨更快哦!
C语言从入门到精通:C程序的组成
一个C程序可以由若干个源程序文件组成,每一个源文件可以由若干个函数和预处理命令以及全局变量声明部分组成,每一个函数由函数首部和函数体组成。c程序的结构如图所示。
作为一名程序开发人员,不可能每次编写都从最底层开发。比如在上例中,要输入一串字符到输出设备上,我们需要做的仅是调用printf()函数,至于\”Hello C! \”是怎样显示的,我们并不关心。我们认识printf()函数,在编写程序时调用它,更需要让程序认识它,这样才能使用printf()函数提供的功能,这就需要使用#include <stdio.h>,包含标准输入输出头文件,这样程序就能够认识printf()函数,并执行其功能。
C提供有丰富的函数集,我们称之为标准函数库。标准函数库包括15个头文件,借助这些函数可以完成不同的功能。
例如, 【范例2-1】中有#include<math.h>时,就可以使用该数学函数库头文件提供的如开平方函数sqrt(),求出半径radius为2时的开平方值1.414;又如,当程序包含头文件\”malloc.h\”时,就可以完成对内存申请和释放等功能。
2.2.2函数声明
标准C语言引入了新的更好的函数声明方法,即用函数原型指定函数更多的信息,通过函数原型可以将函数的名字和函数类型以及形式参数的个数、类型、顺序通知编译系统,以便在调用函数时,系统可以对照检查。
函数声明由函数返回类型、函数名和形参列表组成。形参列表必须包括形参类型,但是不必对形参命名。这3个元素被称为函数原型,函数原型描述了函数的接口。定义函数的程序员提供函数原型,使用函数的程序员就只需要对函数原型编辑即可。
函数声明的一般形式为:
函数返回类型函数名(参数类型1,参数类型2,……);
函数声明包括函数的返回类型和函数名,来看下面这个例子。
其中, int, void和float都是函数返回类型,也属于数据类型。fun, display和fn是所调用的函数名。也就是说, fun()函数返回的数据类型为整型int; display()函数返回的类型为void型,指函数无返回值; fn()返回的数据类型为浮点型float。
fun (int a, int b)数内部的a和b为形参,其参数类型都为int型。fn (float x )函数内部参数x的类型为float型。函数声明中的形参名往往被忽略,如果声明中提供了形参的名字,也只是用作辅助文档。另外要注意函数声明是一个语句,后面不可漏分号!
进一步对函数做解释,需要注意的有以下几点。
(1)函数名称后面必须有小括号,不能省略,这是函数的特征。
(2)函数结束必须有分号,不能省略。
(3)字符串结尾有这样的内容\”\\n\” ,它叫做转义符,表示的合义是把光标移动到下一行的行首,也就是回车换行,因为我们无法直接通过键盘输入换行的指令,所以需要使用转义符;又比如输出内容后希望返回该行的行首,重新输出内容,键盘上也没有对应的功能键,我们就可以使用回车符转义符\”\\r\”来代替。当然,转义还包含其他内容,后续拿节中会详细讲达。
2.2.3变量声明
在大多数语言中,在使用一个变量之前,都要对这个变量进行声明, C语言同样如此。那么,什么是变量的声明呢?有什么作用呢?变量的声明其实就是在程序运行前,告诉编译器程序使用的变量以及与这些变量相关的属性,包括变量的名称、类型和长度等。这样,在程序运行前,编译器就可以知道怎样给变量分配内存空间,可以优化程序。
变量的声明语句的形式如下:
变量类型名变量名
变量的声明包括变量类型名和变量名两个部分。来看下面的例子:
其中, int、double和char是变量类型名, num、area和ppt是变量名。其实,变量类型名也是数据类型的一种,就是说变量num是int类型, area是double类型, ppt是char类型。
变量类型名是C语言自带的数据类型和用户自定义的数据类型。C语言自带的数据类型包括整型、字符型、浮点型、枚举型和指针类型等。
变量名其实就是一个标识符,当然,标识符的命名规则在此处同样适用。除此之外,变量命名的时候还需要注意以下几点。
(1) 变量名区分大小写,变量Num和num是两个不同的变量。
(2) 变量的命名最好与实际应用有关联,例如: num一般表示数量, area表示面积等。
(3)变量的命名必须在变量使用之前。
提示
如果变量没有经过声明而直接使用,则会出现编译器报错的现象。
下面用一个例子来验证声明必须在变量使用的前面。
【范例2-2】验证未声明的标识符不可用。
(1) 在Visual C++ 6.0中,新建名为\”undeclaredvar.c\”的【Text File】文件。
(2)在编辑窗口中输入以下代码(代码2-2.txt) 。
【运行结果】
编译后显示出错,信息如下:
【范例分析】在此例子中,没有对标识符num进行声明就直接引用,编译器不知道num是什么,所以调试时编译器就会报错。
【拓展训练】
在第3句和第4句之间插入语句:
或者:
检验一下程序能否运行,是否还报错。
2.3主函数
每个C程序必须有而且只有一个主函数,也就是main()函数,它是程序的入口。main()函数有时也作为-种驱动,按次序控制调用其他函数, C程序是由函数构成的,这使得程序容易实现模块化; main()函数后面的\”()\”不可省略,表示函数的参数列表; \”{\”和\”}\”是函数开始和结束的标志,不可省略。
下图是对主函数调用其他函数的说明。
主函数main()在程序中可以放在任何位置,但是编译器都会首先找到它,并从它开始运行。它就像汽车的引擎,控制程序中各部分的执行次序。下图是对主函数各部分名称的说明。
在前面的两个范例中,主函数main()的部首都是int类型, int是整数integer单词的缩写,表示返回给系统的数据类型是整型数据,返回值是0,在return句中体现了出来。
2.4函数定义区
C语言编译系统是由上往下编译的。一般被调函数放在主调函数后面时,前面就该有声明,不然C语言由上往下的编译系统将无法识别。正如变量必须先声明后使用一样,函数也必须在被调用之前先声明,否则无法调用!函数的声明可以与定义分离,要注意的是一个函数只能被定义一次,但可以声明多次。
函数定义:
返回类型函数名(参数类型1参数名1,…,参数类型n参数名n)
在程序中,如果main()函数在前,必须在mian()中写函数声明;如果函数在main()前面,可以不在main()中写函数声明!
下面看一个有关函数声明和函数定义的综合例子,比较一下它们有何不同。
2.5注程
读者可能已经注意到,很多语句后面都跟有\”/*\”和\”*/\”符号,它们表示什么含义呢?
在前文已经说过,我们在编辑代码的过程中,希望加上一些说明的文字,来表示代码的含义,这是很有必要的。
费了很大精力,绞尽脑汁编写的代码,如果没有写注释或者注释得不够清楚,一年后又要使用这段代码时,当年的思路全部记不得了,无奈之中,只得重分析、重理解。试问,因为当初一时的懒散造成了今日的结局,值得吗?又比如,一个小组共同开发程序,别人需要在该小组写的代码上进行二次开发,如果代码很复杂、没有注释,恐怕只能用4个字形容组员此时的心情:欲哭无泪。所以,编写代码时最好书写注释,这样做有百利而无一弊。
注释的要求如下。
(1)使用\”/*\”和\”*/\”表示注释的起止,注释内容写在这两个符号之间,注释表示对某语句的说明,不属于程序代码的范畴,比如【范例1-1】和【范例2-1】代码中\”/*\”和\”*/\”之间的内容。
(2) \”/\”和\”*\”之间没有空格。
(3)注释可以注释单行,也可以注释多行,而且注释不允许嵌套,嵌套会产生错误,比如:
/*这样的注释/*特别*/有用*/
这段注释放在程序中不但起不到说明的作用,反而会使程序产生错觉,原因是“这样”前面
的\”/*\”与“特别”后面的\”*/\”匹配,注释结束,而“有用*/\”就被编译器认为是违反语法规则的代码。
2.6代码的规矩
从书写代码清晰,便于阅读、理解、维护的角度出发,在书写程序时应遵循以下规则。
(1)一个说明或一个语句占一行。我们把空格符、制表符、换行符等统称为空白符。除了字符串、函数名和关键字, C忽略所有的空白符,在其他地方出现时,只起间隔作用,编译程序对它们忽略不计。因此在程序中使用空白符与否,对程序的编译不产生影响,但在程序中适当的地方使用空白符,可以增加程序的清晰性和可读性。
例如下面的代码:
(2)用“{\”和\”}\”括起来的部分,通常表示程序某一层次的结构。\”{\”和“}\”一般与该结构语句的第1个字母对齐,并单独占一行。
例如下面的代码:
(3)低一层次的语句通常比高一层次的语句留有一个缩进后再书写。一般来说,缩进指的是存在两个空格或者一个制表符的空白位置。
例如下面的代码:
(3) 在程序中书写注释,用于说明程序做了什么,同样可以增加程序的清晰性和可读性。
(4) 以上介绍的4点规则,大家在编程时应力求遵循,以养成良好的编程习惯。
2.7高手点拨
文件中声明函数,就像变量可以在头文件中声明,而在源文件中定义一样,函数也可以在头文件中声明,在源文件中定义。把函数声明直接放在每个使用该函数的源文件中是大多数新手习惯并喜爱的方式,这是合法的。但是这种方式古板且易出错。解决方法就是把函数的声明放在头文件中,这样可以确保指定函数的所有声明保持一致。如果函数接口发生变化,则只需修改其唯一的声明即可。
将提供函数声明的头文件包含在定义该函数的源文件中,可使编译器能检查该函数的定义和声明是否一致。特别地,如果函数定义和函数声明的形参列表一致,但返回类型不一致,编译器会发出警告或出错信息来指出差异。
那么学过了函数声明与函数定义,它们到底有什么不同呢?我们知道函数的定义是一个完整的函数单元,它包含函数类型、函数名、形参及形参类型、函数体等,并且在程序中,函数的定义只能有一次,函数首部与花括号间也不加分号。而函数声明只是对定义函数的返回值类型进行说明,以通知系统在本函数中所调用的函数是什么类型。它不包含函数体,并且调用几次该函数就应在各个主调函数中作相应声明,函数声明是一个说明话句,必须以分号结束!
学习了这一堂的内容,读者是不是对C语言有更好的理解呢?下面了解一下我们在使用函数时,需要注意的一些问题。
1、函数声明可以省略形参名,但是函数定义的首部必须写出所有形参名并给出其对应的数据类型。
2、函数原型的主要目的是为了声明函数返回值类型以及函数期望接受的参数的个数、参数类型和参数顺序。
3、如果程序中没有某个函数的函数原型(没有说明) ,编译系统就会用第一次出现的这个函数(函数定义或函数调用)构造函数原型。
4、在默认下,编译系统默认函数返回值为int。
在编写函数时的常见错误:当调用的函数与函数原型不相匹配时,程序会提示语法错误,并且当函数原型和函数定义不一致时,也会产生错误。
本文节选自《C语言从入门到精通(第2版)》
本书面向C语言的零基础读者,介绍基础入门知识和实际操作技巧。全书紧贴软件开发的实际需求,首先向读者展示语言的背景知识和应用范围,之后通过实例和自测,系统讲解相关知识点,同时兼顾实际开发项目经验。为了增强实用性,光盘中还特别赠送了精选的考试认证、求职面试等题库,供读者研究学习。最后,为帮助初入职场的从业者顺利进入角色,还在光盘中赠送了职业规划建议及相关开发文档。
C语言基础知识总结大全(干货)
C语言是当代人学习及生活中的必备基础知识,应用十分广泛,下面为大家带来C语言基础知识梳理总结,C语言零基础入门绝对不是天方夜谭!
算法结构:
一、顺序结构、选择结构、循环结构;二、循环结构又分为while型、until型、for循环结构;程序流程图;
结构化程序设计方法:
(1)自顶向下;(2)逐步细化;(3)模块化设计;(4)结构化编码。
数据类型:
常量:常量包括字面常量、直接常量和符号常量;
变量:C语言规定标志符只能由字母、数字和下划线三种字符组成,且第一个字符必须是字母或者下划线;必须压迫先定义后使用;每一个变量被定义以确定类型后,在编译时就能为其分配相应的存储单元;
整数类型:整数常量有十进制、八进制和十六进制;“%d”
整形变量:数据在内存中存放形式是以二进制形式存放;有int型、short int型和long int型,无符号整型变量的范围是-32768—32767,有符号型为0~65535.通常把long定义为32位,把short定义为16位,int可以是32位也可以为16位,这都主要取决于机器字长。
实型常量的表示方法:(1)十进制,0.0;(2)指数形式,123e3
实型变量:实数型数据在内存中的存放形式,一般在内存中占4个字节,分成整数部分和小数部分存放。实型变量分为float型、double型long double型。实型数据会存在舍入误差。
实型常量的类型:C编译系统将实型常量作为双精度来处理。
字符型数组:(一)字符常量:转义字符(\\n——换行,\\t——tab,\\r——回车,\\f——换页,\\b——退格,\\ddd——1到3位8进制的数代表的字符)(二)字符变量:字符数据存储形式实际是以ASCII码存储。“%c”字符串常量:双撇号括起来的一系列字符序列。
C的运算符有以下几种:
1、算术运算符(+ – * / %)结合方向自左向右2、关系运算符(> < ==\”\”>= <= !=\”\”>3、逻辑运算符(! && ||)4、位运算符(<>> ~ | ^ &)5、赋值运算符(=及符号扩展赋值运算符)6、条件运算符(? : )7、逗号运算符( , )8、指针运算符(* &)9、求字节运算符(sizeof)10、强制类型转换运算符((类型))11、分量运算符( . ->)12、下标运算符([])13、其他
控制语句:
完成一定的控制功能。1、if()~else~2、for()~3、while()~4、do~while()5、continue6、break7、switch8、goto9、return
字符数据的输入输出:
1、putchar()输入字符变量2、getchar()只能接受一个字符
格式输入输出:
1、printf(%d—整型,%c—字符型,%ld,%md,%o,%u,%s,%-m.nf,%e,%g)2、scanf(格式控制,地址列表)
数组
一维数组的定义:类型说明符 数组名【常量表达式】;先定义后引用;一维数组初始化时可以只对一部分元素初始化,在对全部数组元素初始化的时候可以部规定长度;但是若被定义的数组长度与提供的初始值不一样时,则数组长度不能省略。
二维数组的定义:类型说明符 数组名【常量表达式】【常量表达式】C语言中存放二维数组是先存放第一行的元素,紧接着是第二行,其实也是以一维的方式存放。如果初始化时能指定所有元素的初始值,第一维大小可以省略,但是第二维不能省略。
字符数组:定义和初始化跟数组差不多,只是需要加单引号。字符和字符串结束标志,C语言规定,以\’\\0’代表。
字符串处理函数:1、puts()将一个字符串输出到终端2、gets()从终端输入一个字符串到字符数组,并且得到一个函数值。3、strcat()链接两个字符数组中的字符串。4、strcpy()字符串复制函数。5、strcmp()比较字符串作用。6、strlen()测试字符串长度的函数不包括“\\0”7、strlwr()将字符串中的大写字母转换为小写字母。8、strupr()将字符串中的小写字母转换为大写字母。
函数
(1)一个源程序由多个函数组成。(2)C程序的执行从main()函数开始;(3)所有函数都是平行的;(4)函数分类;可以分为标准和自定义,还可以分为有参函数和无参函数。
函数定义的一般形式:
(1)类型标志符 函数名(){声明部分语句}(2)类型标志符 函数名(形式参数列表){声明部分语句}
关于形参和实参的说明:
(1) 在定义函数中指定的形参,在未出现函数调用时,他们并不占用内存中的存储单元,只有发生调用时,才会分配内存。(2) 实参可以是常量、变量或者表达式;有时传递的时地址;(3) 在被定义中,形参必须指定类型;(4) 实参与形参的类型应相同或赋值兼容;(5) C语言规定,实参变量对形参变量的数据传递是“值传递”,即单向传递,只有实参传递给形参,而不能由形参传递给实参。
函数的返回值:
希望通过函数调用使主调函数得到一个确定的值。(1)函数的返回值是通过函数中的return语句获取的。(2)函数值的类型;(3)如果函数值的类型和return语句中表达式的值不一样,则以函数类型为准。(4)如果调用函数中没有return语句,并不带回一个确定的用户需要的值,函数不是不带回值,而只是不带回有用的值,带回一个不确定的值。(5)如不需要带回任何值,用void。
函数的调用:
调用方式1、函数语句;2、函数表达式;3、函数参数。
被调用的函数的声明:
一个函数调用另一个函数所具备的条件:
1、首先被调用的函数必须是已经存在的函数;2、如果使用库函数,一般应该在本文件开头用#include命令将调用有关库函数时在所需要用到的信息“包含”到本文件中。.h文件是头文件所用的后缀。3、如果使用用户自己定义的函数,而且该函数与使用它的函数在同一个文件中,一般还应该在主调函数中对被调用的函数做声明。4、如果被调用的函数定义出现在主调函数之前可以不必声明。5、如果已在所有函数定义之前,在函数的外部已做了函数声明,则在各个主调函数中不必多所调用的函数在做声明。
局部变量和全局变量:
(一)局部变量在一个函数内部定义的变量是内部变量,它只是在本函数范围内的有效,主函数也不能使用其它函数中定义的变量;不同函数中可以使用相同的名字的变量,他们代表不同的对象,互不干扰;形式参数也是局部变量;在一个函数内部,可以在复合语句中定义变量,这些变量只在本复合语句中有效,这种复合句也可以称为“分程序”或“程序块”;
(二)全局变量,在函数之外定义的变量称为外部变量,全局变量可以增加函数间数据联系的渠道,一般不再必要时不要使用,他在程序的全部执行过程中占用存储单元,是函数的通用性,使用全局变量会使程序的清晰性降低。还要注意若果同一源文件中,外部变量和局部变量同名,则在局部变量作用范围内,外部变量被“屏蔽”,不起任何作用。
变量的存储类别:
(变量值存储时间)动态存储方式,在程序运行期间进行分动态的分配存储空间的方式,静态存储方式是指在程序运行期间分配固定的存储空间的方式;存储空间分为程序区、静态存储区和动态存储区;全局变量全部放在静态存储区中,程序开始时分配空间,完毕时释放;动态存储区中存放以下数据:
1、函数形式参数;
2、自动变量;
3、函数调用时的现场保护和返回地址;在C语言中每个变量和函数都有两个属性,是数据类型和数据存储类型,存储类别是数据在内存中存储的方式。
存储方式分为静态和动态存储类,具体包含有四种:自动的(auto),静态的(static),寄存器的(register),外部的(extern),如果不加以声明,就自认为是auto型就会自动分配存储空间属于动态存储方式。
Static声明局部变量是在函数调用结束后不消失而保留原值,即占用存储单元不释放,在下一次调用该函数时,该变量已有值,就是上次函数调用结束时的值。其中需要说明的是在定义局部变量不赋初值的话,则静态局部变量编译时自动赋值为0或者空字符,虽然静态局部变量在函数调用结束后仍然存在,但是其他函数不能引用它的。静态局部变量主要用在当初始化后,变量只是被引用而不改变其值。
Register变量是C语言中允许将局部变量的值放在CPU中的寄存器中需要时直接从寄存器中取出来参加运算,不必再到内存中提取,但是计算机系统中寄存器数量有限,不能任意定义任意多的存储器,局部静态变量不能定义为寄存器变量。
Extern声明外部变量,用以扩展外部变量的作用域。在一个文件中,如果定义之前的函数想引用该外部变量,则应该在引用之前用关键字extern对该变量做外部变量声明。在多文件中,也可以采用extern声明的办法进行外部变量声明。有时希望某些局部变量只限于被本文件引用,而不能被其他文件引用,这时就可以采用在定义外部变量时外加一个static,这在程序模块化设计中加强了通用性。
Static来声明一个变量的作用有二个,一个是在声明对局部变量时。则为该变量分配的空间在整个程序执行期间始终存在;一个是在对全局变量声明中,该变量的作用域仅限于本文件模块操作。
注意:这些方法同样适用于函数的声明。
本文作者及来源:Renderbus瑞云渲染农场https://www.renderbus.com
文章为作者独立观点不代本网立场,未经允许不得转载。