C语言程序设计知识点总结02
Posted 宣哲
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言程序设计知识点总结02相关的知识,希望对你有一定的参考价值。
C语言程序设计知识点总结02
递归概念(recursion):
函数直接或间接地调用自己。
直接递归:函数直接调用自己。A调用A自己。
间接递归:函数间接调用自己。A调用B,B再调用A等。
递归编程要点:
一定要注意递归结束条件和参数的变化。
生存期(lifetime): 变量何时生成及何时撤销。
作用域(scope) : 变量在程序的什么范围内是可以使用的。
存储类别(storage type): 变量存储在哪种存储器区域中并以何种方式存储。
全局变量(global variable):在任何函数之外定义的变量。
局部变量(local variable):在函数或语句块之内定义的变量。
作用域原则:
1、全局变量的作用域为定义它的位置到文件结束。
局部变量的作用域为定义它的函数或语句块内部。
2、当全局变量与局部变量同名时,在局部变量的作用域内局部变量起作用,全局变量被屏蔽。
3、可以用extern关键字扩展全局变量的作用域。
4、全局变量用static修饰时只能在本文件内起作用。
生存期原则:
1、全局变量的生存期为整个程序的生存期,即从程序进入内存到程序运行结束退出内存。
非静态的局部变量的生存期为进入定义它的函数或语句开始到退出该函数或语句块为止。
2、静态的局部变量的生存期为整个程序的生存期,即从程序进入内存到程序运行结束退出内存。
局部非静态变量:修饰为:auto或无,register
分配在栈或寄存器中。
局部静态变量:修饰为:static
分配在全局数据段中。
全局变量:分配在全局数据段中。
C程序基本结构:
一个C程序由一个或多个函数构成,这些函数分布在一个或多个源文件中,每个文件称为一个可编译单元。
模块化编译方法: 先将各个可编译单元分别编译,然后再将其链接起来构成可执行程序。
编译预处理:
在编译器编译源程序之前先进行的一些处理,如包含头文件,宏定义和宏展开以及条件编译等。C源程序中以#开头的行均为编译预处 理。
头文件:
通常包含类型定义,常量定义,函数声明等。
宏:
用一个名字(宏名)命名一个字符串。在编译之前,将程序中的所有宏名替换成对应的字符串,然后再编译。
注意:字符串和标识符中的和宏同名的串不替换!
条件编译:
根据特定的条件来决定是否编译某些代码段。
数组(Array):
相同类型的变量,在内存中连续存储。数组名指出了其存储的首地址,每个变量称为一个数组元素,数组中元素的个数称为数组的大小。数组元素的引用通过下标(index)进行。 数组为程序员提供了定义和处理多个同类型变量的方便。
一维数组的定义:
语法格式:数组元素类型 数组名[ 数组大小 ]; 例如:int arr[10];
注意:数组大小必须为常量表达式。
一维数组元素的引用:
语法格式:数组名[ 下标 ]
注意: 1. 下标必须为整型表达式。
2. 第一个元素的下标为0,最后一个为数组大小减1。
3. 如果数组元素下标超出正常的范围,则称为越界,下标越界不会导致语法错误,但通常会导致逻辑错。
一维数组的初始化:
1. 定义时初始化:
A. 完全初始化
int a[10] = 1, 2, 3, 4, 5, 6, 7, 8, 9, 10;
int a[ ] = 1, 2, 3, 4, 5, 6, 7, 8, 9, 10;
B. 部分初始化
int a[10] = 1, 2, 3; /* 其它元素为0 */
2. 使用时初始化:使用前先给各个元素赋值。
scanf(“%d”, &a[0]);
简单查找算法:
1、顺序查找。(数组可无序!)
2、折半查找。(数组必有序!)
简单排序算法:
1、 冒泡排序。
数组作为函数的参数:
传递的只是数组名,即数组在内存的首地址,并不把所有的数组元素的值传递给函数。在函数内对数组的操作也就是对原来的数组进行操作。
字符数组:
每个数组元素是字符的数组。
例:char str[ ] = ‘a’, ‘b’, ‘c’;
字符串:
用双引号括起来的若干个字符构成的序列。如“abc”。
注意:C语言中字符串是以字符数组的形式在内存中存储的,每个字符以ASCII码存储,结束符为’\\0’。 “a”在内存中为:’a’,‘\\0’。而‘a’在内存中为’a’。
sizeof(“a”) = 2; strlen(“a”) = 1;
sizeof(‘a’) = 4 // C99的标准, \'a\'是整型字符常量,常量!常量!常量!被看成是int型, 所以占4字节。
字符串的初始化:
1. char str1[ ] = ‘a’, ‘b’, ‘c’, ‘\\0’;
2. char str2[ ] = “abc”;
3. char str3[ ] = “abc”;
4. char str4[4] = ‘a’, ‘b’, ‘c’, ‘\\0’;
5. char str5[4] = “abc”;
6. char str6[4] = “abc”;
字符串操作库函数:
1. gets与puts:输入输出
2. strlen:求字符串长度
3. strcpy:字符串拷贝
4. strcmp:字符串比较
5. strchr:串中查找字符
6. strcat:字符串连接
二维数组的定义及初始化:
语法格式:类型 数组名[行数][列数];
注意:二维数组定义时行数和列数必须是常量表达式。二维数组在内存中按行存储。
int a[2][3] = 1, 2, 3, 4, 5, 6;
int a[ ][3] = 1, 2, 3, 4, 5, 6;
int a[ ][3] = 1, 2, 3, 4, 5, 6;
二维数组元素的引用:
数组名 [行号][列号]
注意:行号和列号必须是整型表达式。行号和列号的范围为[0, 大小 – 1]。
从零开始学C语言知识总结一:C语言的基本知识汇总
目录
一、介绍
C语言是一种计算机程序设计语言。它既有高级语言的特点,又具有汇编语言的特点。它可以作 为系统设计语言,编写工作系统应用程序,也可以作为应用程序设计语言,编写不依赖计算机 硬件的应用程序。
事实上,C语言是一个很小的内核语言,只包括极少的与硬件有关的部分,C语言不直接提供输入输出语句,有关文件都是要文件操作的语句和动态内存管理等操作都是要使用到系统提供的库函数来实现的,可以说C语言就是一种结构化程序语言,这是一种分的思想, 以Hello World程序为例,可以建立两个函数,一个输出Hello,一个输出World。
2、C语言的数据类型列表:(后边再详解)
整型、浮点型(实数型)、单字符型、字符串型、数组类型、指针类型、结构体类型、共用体类型
3、C语言的控制语句列表:(后边再详解)
跳转型:goto语句、break语句、continue语句、return语句
判断型:if-else语句
循环型:do-while语句、while语句、for语句
选择语句:switch-case语句
4、最简单的C程序:
#include<stdio.h>
int a=3; //这是全局变量 a在整个程序中都可以起作用
void f(int n); //里边的n就是形式参数
int main(void)
int n; //在这里定义一个n和形式参数的n互不影响
int b=50; //这是局部变量 b出了main函数它就没有作用了
int a=2; // 在这里定义一个a和外边那个a没有联系
if(a>b) //这种就是复合语句 (包括其他循环、选择语句)
int a=1; // 在再这里定义一个a和外边那些a没有联系 但是
//根据变量的特点 如果相同变量名称的时候
//复合语句的变量会覆盖外边main函数的a,main函数的a会覆盖外 // 边全局变量的a
//(小覆盖大)
void f(int n)
int n;//这里定义一个n也和形式参数的n没有任何联系
1 )、一个程序由一个或者多个源程序文件组成,一个源程序中只有一个mai函数(主函数)
2)、预处理指令:
1、 如#include<stdio.h>,(还有其他的指令,用到再讲)C编译环境在对源程序进行“翻译”之前,都会先去做一个事情,先由一个预处理器,对预处理指令进行处理,对于<stdio.h>指令来说,就是在使用标准函数库中的输入输出函数时,编译系统要求程序提供有关的信息,#include 叫做文件包含命令 它的作用就是用来提供这些信息的,用来引入对应的头文件(.h文件),这样才能调用库函数。
2、#include 的处理过程很简单,就是将头文件的内容插入到该命令所在的位置,从而把头文件和当前源文件连接成一个源文件,这与复制粘贴的效果相同。
3、使用尖括号< >和双引号" "的区别在于头文件的搜索路径不同:
使用尖括号< >,编译器会到系统路径下查找头文件;
而使用双引号" ",编译器首先在当前目录下查找头文件,如果没有找到,再到系统路径下查找。
5、全局变量和局部变量:
#include<stdio.h>inta=3;//这是全局变量 a在整个程序中都可以起作用voidf(intn);//里边的n就是形式参数intmain(void)intn;//在这里定义一个n和形式参数的n互不影响intb=50;//这是局部变量 b出了main函数它就没有作用了 inta=2;// 在这里定义一个a和外边那个a没有联系if(a>b)//这种就是复合语句 (包括其他循环、选择语句) inta=1;// 在再这里定义一个a和外边那些a没有联系 但是//根据变量的特点 如果相同变量名称的时候 //复合语句的变量会覆盖外边main函数的a,main函数的a会覆盖外 // 边全局变量的a //(小覆盖大)voidf(intn)intn;//这里定义一个n也和形式参数的n没有任何联系复制代码
1、局部变量 只能在声明的函数内部使用,离开了声明的函数,就不能使用该变量了。不同的函数可以使用相同名字的变量,它们代表不同的对象,互不影响,形式参数也是局部变量,在一个函数的内部也可以在复合语句中定义变量,这些变量中也只是在本复合语句中有效。复合语句称为分程序,或程序块。
2、全局变量不仅可以在main函数中,而且可以在别的函数中使用,也就是说全局变量是可以在程序中的任意地方使用。它可以增加函数之间数据的联系,它在程序的全部执行过程中都会占用存储单元,是函数的通用性。总结来就是说两者作用域不一样
6、C函数的定义:
一个C程序是由一个或者多个函数组成的,但是其中必定要有且只有一个main函数,程序开始也是从main函数开始的。
一个函数包含两部分:1)函数首部,函数的第一行:函数类型、函数名,(函数参数类型,函数参数名称),其是(形式参数),形式参数可以是void ,也可什么都没有。2)函数体,表示函数花括号下的程序,一般都有:声明部分,一般在使用一个变量之前,必须进行对其声明定义类型(数据类型),在每行数据声明或者C语句后必须有一个分号表示结束。
7、说明:
C语言本身不提供输入输出语句,输入输出的操作都是要调用系统库函数scanf和printf等函数来实现的,而此函数是在<stdio.h>,文件里面,所以在开头必须先预处理此头文件。
而形参和实参:当我们调用函数时,对其传入的参数和函数体内接收到的参数其实并不是同一个变量。调用函数时向函数传入的参数称作实际参数,简称实参,而函数体内部用于接收外部调用时传入的参数的参数称为形式参数,简称形参。
8、C程序运行步骤:
编程—>编译—>链接
1、编程:在编译环境中书写程序,编写好了之后,系统会将此源程序,以.c为后缀的文件形式存放在指定的文件夹中,如 f.c文件
2、编译:编译环境会对源程序进行语法检查,如有发出错误信息提醒编程人员修改,直到没有语法错误,编译程序自动将源程序转换为二进制形式的目标文件 是以后缀.obj文件保存。
3、 链接:经过编译所得到的二进制目标文件,还不能别计算机直接执行,它们还只是零散的一个个部件,必须由链接程序将编译后的目标文件和函数库还有其他生成的文件组成起来,生成一个计算机能执行的可执行文件。后缀名为.exe文件
9、C变量存储方式与生存期:
1、在c语言中,变量的作用域 可以分为全局变量和局部变量,而从另一个角度说,变量的储存有两种不同的方式,静态储存方式和动态储存方式。静态指的是程序运行期间 由系统分配固定的空间给程序,而动态 则是程序运行期间 需要根据情况进行动态分配储存空间的方式
2、内存中使用储存空间的情况,可以分为以下三种:
(1)程序区
(2)静态储存区,存放全局变量 负责给程序运行时分配内存区 在静态数据区,内存中所有的字节默认值都是0x00
(3)动态储存区,它存放以下数据:
1、函数形式参数,在调用函数时给形参分配储存空间
2、函数中的自动变量
3、函数调用时的现场保护和返回地址等
4、对变量的储存类型有四种,分别是:auto (自动变量)、static (静态变量)、register( 寄存器变量)、 extern(外部变量)
对以上这些数据,在函数开始调用时分配动态存储空间,函数结束时释放这些空间。在 c 语言中,每个变量和函数有两个属性:数据类型和数据的存储类别。
1- auto (自动变量)
在程序的函数中的局部变量,如果不专门声明为静态(static)存储方式,都是自动分配动态的地址存储空间。包括复合语句和函数的形参 都是的,自动变量用关键字 auto 为声明。重点是这些变量在函数调用完毕后它们都会被系统给释放回收内存
2- static 静态变量(局部变量)
有时候,我们希望自己的局部变量不被函数调用完毕后消失,而继续保持原值,其占用的储存单元不是释放,用关键字 static 进行声明 这类变量叫静态变量。它和全局变量相同的是,在函数调用结束后,它并不释放内存,保留其当前值,而且在整个程序运行时,都不释放内存。不同的是。它本质还是局部变量,在其他函数中也不能使用它,而且,它只能进行第一次赋值,在整个程序运行时,它只会保留上一次函数调用结束时的值。
一个被声明为静态的全局变量可以被模块内(源程序)所用函数访问,但不能被其他模块外(源程序)其他函数访问,它是一个本地的全局变量
一个被声明为静态的函数只可被这一源程序的其他函数调用.那就是,这个函数被限制在声明它的模块本地范围内使用
全局变量(外部变量)的说明再冠以static
就构成了静态的全局变量。当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误。
把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域,限制了它的使用范围(只能在本地)
static函数与普通函数作用域不同,仅能在本源文件内使用此函数。
3- register( 寄存器变量)
在程序运行时,如果一个变量,被频繁使用,那么系统就必须多次访问内存中的单元,会影响程序执行效率,因此为了提高效率,就产生了寄存器变量,它可以直接将局部变量的值存放到CPU的寄存器中,需要时,直接从寄存器中取出参数运算,不必经过内存中取存储,由于受硬件寄存器长度的限制,所以寄存器变量只能是char、int或指针型。寄存器说明符只能用于说明函数中的变量和函数中的形参,因此不允许将外部变量或静态变量说明为"register"。由于寄存器的存取速度远高于对内存的存取速度,所以这样可以提升执行效率。
4- extern (外部变量)
一般来说外部变量是函数的外面定义的全局变量
如果没有在头文件中定义有外部变量(文件的知识)
那如果在一个程序中如果需要在一个源文件内扩展到另一个源文件的作用域的全局变量,就可以在定义函数时引用extern关键字将该变量转为“外部的变量”,表示将此变量的作用域扩展到此位置,有了此声明,就可以在其他源文件中使用此变量了。
将全局变量的作用域扩展到其他文件,可以先在一个文件中定义一个变量,然后再在其他文件中用extern定义相同名字的变量,就可以将作用域扩展到整个程序的结束了。
*注 如果在文件1中的全局变量加了static那么这个变量就会被限制在此文件中了,在文件2中使用extern也访问不到文件1的全局变量了
在一个函数声明前加extern 此函数就会可扩展作用域,可以在其他文件中使用此函数。
END
文章来源:稀土掘金:Mr_Li_
对啦对啦!另外的话为了帮助大家,轻松,高效学习C语言/C++,我给大家分享我收集的资源,从最零基础开始的教程到C语言项目案例,帮助大家在学习C语言的道路上披荆斩棘!
可以来我粉丝群领取哦!最重要的是你可以在群里面交流提问编程问题哦~
以上是关于C语言程序设计知识点总结02的主要内容,如果未能解决你的问题,请参考以下文章