第一章
计算机发展史:机器语言到汇编语言再到高级语言(有面向过程的,有面向对象的。)
计算机系统:硬件系统+软件系统
硬件我们现在还用的是五大结构(诺.依曼):运算器,控制器,储存器,输入设备,输出设备。运算器和控制器共同构成我们的中央CPU。
软件就是有系统软件和应用软件
计算机也不能识别高级语言必须转换成二进制,有两种方式解释方式和编译方式其中C语言就是编译方式,像Java就是解释方式
C语言(结构化的程序性设计语言)被称为高级语言中的低级语言,并不是说他低级,而是因为他有以下特点:
关键字32,9种控制语句,三十四种运算符
C语言结构特点:
C程序的上机步骤(开发)步骤:
编辑(生成.c原文件)编译(用编译器对其进行调试看是否有错误,无错误就可生成目标程序.obj文件)链接(与其他目标函数或库链接装配生成可执行程序.exe)执行(出结果,也就是运行了)
程序设计的任务:与开发步骤类似有:问题分析(遇到问题我们才解决问题),设计算法(将形象问题转化为抽象问题设计方法步骤。),编写程序,对源程序进行编辑编译和连接,运行程序分析结果,编写程序文档(就是可以打包给他人了)
程序是从哪里开始进行的?
是从程序中的第1个慢函数开始,到程序中最后一个函数结束,其中可以自定义函数,然后调用就可以了。
计算机系统:硬件系统加软件系统
硬件我们现在还用的是五大结构(诺.依曼):运算器,控制器,储存器,输入设备,输出设备。运算器和控制器共同构成我们的中央CPU。
软件就是有系统软件和应用软件
C语言是面向过程的,C++是面向对象的
计算机中我们有一些单位:
8比特等于一字节;1024byte等于1KB;1024 KB=1 MB;1024 MB=1 GB;1024G等于1Tb
一个整形常数占四字节,一个占两个字节
第二章
什么是算法?
为解决一个问题,而采取的方法和步骤,由一组有序的步骤或程序来实现
好算法应该方法简单运算步骤少,执行速度快。
算法分为两类:
一种是数值运算算法:也就是求数值的解。
非数值运算算法:这个用的广,主要用在事务管理,信息处理等。这些就需要我们去设计。
程序等于算法加数据结构
但教材认为程序等于算法加数据结构加程序设计方法加语言工具和环境
数据结构:
对数据的描述就是数据结构(用到哪些数据数据的类型和数据的组织形式)
算法:
对操作的描述就是算法(要求计算机进行操作的步骤)
而数据又是操作的对象,操作就是为了对数据进行加工处理。
算法的特性:
- 有穷性:方法步骤是有限的。
- 确定性:每一步都应当确定
- 有0个或多个输入
- 有一个或多个输出
- 有效性:每一个步骤都应当有效的执行并得到确定的结果
我们如何表示一个算法?
表示一个算法的方法我们一般用流程图法和N-S流程图
它有三种基本结构:顺序结构,选择结构。循环结构:当型(while)循环结构(先执行判断,如果为真就进行循环假就结束循环),直到(until)型循环(先进行处理框,然后再到判断,假就进行循环。,真就结束循环。)第1个是不满足了就输出,第2个是一直处理,直到让他满足
三种结构有共同点:只有一个入口,只有一个出口。结构内的每一部分都有机会被执行到结构内不存在死循环(无终止的循环)。
说明:并不只有这三种基本结构,我们也可以创建基本结构,但一般这些结构都与这三种结构有关。
结构化程序设计方法
结构化程序:用三种基本结构组成的程序
基本设计思路:复杂问题分解成几个最基本问题在分别处理
采用的方法:
- 自顶而下
- 逐步细化
- 模块化设计:复杂问题按功能分成多个子模块。
- 结构化编码:正确采用三种基本结构实现
第三章
常量和变量
常量有5种:整型,浮点型,字符,字符串型,符号常量。也可以叫两种:直接常量和符号常量
符号常量:就是用#define定义的标志性常量。宏定义属于预处理指令。
优点是贱民之意,一改全改。
标识符:
命名规则特别要注意:不能与关键字名字冲突,而且必须是由字母数字下划线构成其中不能以数字打头
整型数据:整型数据在内存中存放形式
数据在内存中以二进制补码的形式存放,要注意正整数加0和负数的区别
正整数的原码反码补码相同
而负数的补码等于源码的绝对值的反码加1
整常量的三种表示方式:
- 十进制整数,这是我们平常数学中的0123456789
- 8进制整数 ,表示的是0~7的数,8进制数前要加个0区分
- 16进制整数,表示的是0~9加上A~F或a~f
还有一些不同类型的整形常量的表示方式
整型变量
整形变量的分类:分为三类基本整形,短整形,长整形,都各自有(unsigned)无符号和有符号之分
用十来举例它转化为二进制的补码为00000000000000000000000000001010
加上unsigned后无符号之分,上面的数全为数值位,无符号位,也就是说表示的数没有负数都是非负数。
给变量赋一个值,就会给这个变量分配存储空间,而这些数据是以二进制补码的形式存放
特别注意负数要取绝对值,然后求反码,最后加一得到补码。
浮点型(实型)数据:
浮点型常量的表示方式:
- 十进制小数形式:必须有小数点
- 指数形式:e或E之后必须有数字,指数必须为整数。
给个图就明白了
浮点型变量:
我们熟悉的float double longdouble
他在32位编译器下内存中占4个字节。
他是以指数形式存放在内存里
所以它在内存中分为三部分,指数为二的幂次。
字符型数据:特别注意没有字符串变量,有字符串时我们需要用数组来存放。
我们知道一个字符用单引号括起来
而字符串是以双引号括起来
字符常量:
用单引号括起来的单个字符或转义字符。
字符常量的值为该字符的ASCII码值
其中的转义字符(是为了改变输出格式,形象说就是改变了他原来的意思):反斜线后面跟一个字符或一个代码值表示。
每个转义字符的含义及转义字符的使用要注意。在博客可以查他们的具体作用。
字符变量:
存放字符常量占用一个字节,存放一个字符。
char是定义字符变量的
字符数据在内存中以二进制存放字符的ASCII码值。与整形的存放形式类似
如果我们定一个字符变量后面赋值时可以写字符,也可以写它对应的ASCII
当打印输出时,如果我们格式为整形打印出来的就是数字,规定字符型出来的就是字符
同样的在整形中赋值,如果是在阿斯克码值之内,在打印时规定不同的类型可以打印出不同的结构。
也就是说他俩在一定范围内是通用的。
总结一下,前面说到的。用这个可以回忆。
第3章纸质总结
注意混合运算时:出现短整形,字符型就要自动转换成整形,出现单精度浮点型,要自动转化成双精度浮点型
其他的根据左右数据判断,只要出现单精度浮点型,结果就是双精度浮点型。
加减乘除中只要有一个实数结果就为双精度浮点型
特别注意5/2 与5/2.0不一样
前一个是整形的运算,只能输出整形
后一个就可以输出双精度浮点型
可以根据程序算法要求想法自定义
要注意运算符,要学习哪些
比如取余两边只能是整数
运算符优先级别以及结合方向
加减乘除取余 我们的结合方向都是从左向右称为右结合性
而赋值表达式是从右往左称为左结合性。
但还是要注意一个数值左右的优先级别为前提
初学者先学
()> - ++ -->+-/*%>& | ^ << >> >=>,
强制类型转换运算符优先于自增自减运算符优先于算术运算符优先于位运算符优先于赋值运算符优先于逗号运算符。
其中注意逗号运算符优先级最低,要注意识别它是运算符的作用还是分隔的作用
赋值表达式的值等于最后一个表达式的值
注意中间,如果有变量变化,但是没有再付,回去就没有保存,如果再次调用的话,就还是会向前面的表达式调用。
就像a=3*5,a*4,a+5这个表达式的值是20而不是65 (表达式加上;就构成语句,区别表达式和语句,用表达式的时候千万不要误用语句加上;也就是赋值表达式,可以包含在其他表达式中构成嵌套表达式,但是赋值语句不可以)
详细运算符可转至这位大佬:详细运算符总结
语句扩展
总共有5种基本语句:控制语句(9种控制语句。),函数调用语句(有库函数调用语句和自定义函数调用语句),空语句(没有什么功能,但是有一些项目需要延迟时间,这个空语句可以适当延长时间),表达式语句(最常见的就是赋值语句。),复合语句(一般在循环的时候要加花括号构成循环体不加括号的话就只能识别第1行复合语句可嵌套)
输入输出
C语言本身没有1/0语句,所有1/0都是由函数来实现。
注意在调用C语言库函数时,需要使用编译预处理命令也就是我们要写相关的头文件
常见头文件:
- stdio.h 主要定义输入输出函数(printf,scanf,getchar,putchar,puts,gets)
- string.h 定义字符串操作函数strlen
- math.h 定义sin cos等数学函数
字符数据的输入输出
putchar函数(单字符输出函数)可以输出一个字符,也可以输出一个字符变量。
输出控制字符
putchar只能输出一个字符,输出多个字符要多次使用
getchar函数(单字符输入函数)
格式:getchar();
强调:输入单个字符后,必须按一次回车计算机才接受输入的字符
格式输入与输出
printf函数(格式输出函数)
三种格式
引号里的除了格式之外,其他都原样打出
- printf(格式控制,逗号输出表列)将内容以规定格式打出。
- printf(“ ”);将双引号的内容原样打出
- printf(“”,);双引号里除了可以规定格式外还将里面其他的内容原样打出,右半部分就是要以前面规定的格式打出的内容
格式字符:
%d (0~255的整形数对应各种字符,在这个范围内字符可以用10进制整数表示,这个范围内可以混用) %0 %x(这里的X如果小写输出的字符就是小写的反之) %s %c %f %lf........
%md 中的m表示输出字段的域宽
%.s 小数点前的数表示的是输出字符串的域宽正数就是右对齐,负数是左对齐。小数点右边的值表示的是能输出的字符数
%.f 小数点前的数表示输出实数的域宽,正数就是右对齐,复数就是左对齐。小数点后面的值表示的是该实数输出时保留几位小数
具体的格式字符详解见这位大佬:格式字符详解
scanf函数(格式输入函数)在输入格式中,就是前面的双引号中定义输入格式的时候,默认的分割符是空格回车tab等这些分割符,如果用逗号隔开或者其他的隔开输入的时候需要把这些加上才能正确输入计算机中
格式:scanf(格式控制,地址表列);
正确理解地址运算符&的意义:
你想将键盘的数按指定格式输进去,往哪里输呢?只要看你要实现什么功能,哪里可以储存数值呢,变量里呀!&的作用就是通过他的地址来找到这个储存单元,并把它存进去。
第四章
我们要学习选择语句
if和swtich的使用
我们在这里先补一下关系运算符,逻辑运算符,条件运算符的使用。
先说一下关系运算符
关系运算符:
< > >= <= !===其中前4个属于一个优先级后两个属于一个级别前面的优于后面。
关系表达式:
关系运算符都是双目运算符。
其中关系表达式的值是一个逻辑值关系成立就为1关系不成立就为0。
逻辑运算符:
&& || ! 其中前两个属于一级!属于第2级仅次于括号运算符,!具有右结合性!后面等等表达式的值,如果如果是非零,则这个就为假。只有当它是0的时候,加上非逻辑才为真。与运算符,一假为假,或运算符,一真为真,这里要注意。多个或运算符或多个与运算符单独构成复合表达式时,要注意短路现象,就拿与运算法来说,如果第1个为假那程序后面就不用再进行了因为这个肯定没假了注意在这里考察,后面的表达式是否执行,同理或也是这个道理,他是如果第1个为真,后面就不用再考虑了
条件表达式:
表达式1?表达式2:表达式3
这个表达式就是先判断第1个表达式为真还是为假如果为真就执行表达式2。如果为假就执行表达式3。这个表达式可以嵌套就是可以放在一起。这个时候要注意嵌套的条件表达式要从右到左执行,如果要实现两个选择那这个条件表达式就可以代替if else选择语句
If 选择语句:
有三种表现形式第1种是单纯的,if一个分支。
第2个是if else属于两个分支
第3个是if elseif else if等等等。到else
逻辑很简单就是如果if后面的表达式非零为真的话。 就执行if后面的语句否则就直行else后面的语句如果是多分支语句的话我们那时候就一步一步的判断直到找到符合条件的输出后面的语句,然后结if,如果条件都不成立的话,就都不选择。
swtich多分支选择语句:
swtich(非实型表达式)
{
case 非实型的常量:
语句
..........
}
具体的逻辑是什么呢?
我们先进行swtich后面的非实型表达式的计算
计算出的值与下面case后面的常量对比,如果相等就从这里进去执行他后面的语句,直到遇到break;停止,我们说多个case可以共用一条语句你只要设定好break就可以就比如判断是星期天还是工作日这个程序你输入12345。都是工作日,所以就会说是工作日,6日这就是星期天这个时候你只要在case 5:到后面加上输出语句即可,我们要注意break是跳出的意思跳出自己所在的选择范围如果是Swiss里面嵌套一个swtich的话这个时候就要判断,最后输出的是一定要判断好,Break是跳出他所在的swtich
这里我们还要注意default的应用,这句话可加可不加,可根据你的需求,如果你输入的数与之case没有对应的值就执行这条语句或者在没有break的情况下,他也会跟着执行到底。这条语句可以放在前面,也可以放在后面,不影响。
实例:1将几个数从小到大排序输出
2判断哪一年为闰年
3求解二次方程的根
3
第五章
我们先说一下++i i++的具体用法,以免在循环中混淆,我们知道前置加加是先加后用,而后置加加是先用后加,这里的用是什么意思呢?是只有加加I和I加加。属于算术表达式,输出函数。赋值表达式中这才叫用,这里才区分它是前置还是后置。,在循环中,我们要控制循环的次数,所以要有调整部分一般我们就用这个自增运算符这里的挨家家是单独的一条语句。所以就没有用之说这里不管是前置加加还是后置加加都=I=I+1这里要知道我们才不会混淆
书面的简单总结
这里面要强调的是Break只能用于循环结构和switch结构里,而continue只能用于三种循环结构中
在for循环中,表达式1和表达式2可以是逗号,表达式
表达式2可以是任意表达式
循环的嵌套:内外循环的话,我们就称为二重循环,他们都需要不同的循环控制变量(循环控制变量只能为整型)
本章实验报告
以后判断任意数是否为素数的时候,可以在循环前面定一个变量给他赋个值为1,然后我们在下面结节的时候,如果有一个数能整除这就在刚刚的那个数负为0,Break跳出,之后再用判断语句,if(i)是素数他就不为0。不是叔叔他就为0这样确实很方便
第六章
分类
一维数组二维数组(都为数值型)(整型实型)
字符数组(字符型,字符串)
数组
属于构造类型,数组是有一定顺序的若干相同类型变量的集合如int a[10],给他分配的存储空间就是40字节,创建后是按顺序给他开辟存储空间并按顺序排列存储,数组名命名规则与标识符一样,
数组元素:组成数组的变量,用数组名和下标确定。对于一维数组来说,就是一个下标就可以唯一确定,二维就是两个下标唯一确定......
一维数组的定义和引用:
定义:数据类型 数组名 [常量表达式],一定不能是变量,因为你要定义的数组,一定要确定它的元素个数。
数组名是地址常量,不能与其他变量进行加减乘除。
数组名就是第1个元素的首地址与a[0]等价
我们定义时一定要注意,你前面的元素个数应该大于等于后面初始的元素个数
一维数组元素的引用:
对于数值型数组,只能逐渐引用数组元素,不能一次引用整个数组,所以如果你要往数组里输一些数,要用到循环,配合元素的引用,输入函数,来进行输入,我们数组的输出和输入,循环控制变量数组数组下标有联系
下标:可以是常量,也可以是整形表达式,前面下标时不能越界,就是说你的下标一定小于等于定义数组的元素个数减1
数组的初始化:一边定义一边赋值才叫初始化
如果是先定义的后面再给其中的元素赋值就不叫初始化
初始化的实现:用法不同,初始化的方式也要不同,如果你只是想在数组里面输入一些数,你就要用这些数那直接规定好元素个数,后面全部都赋值,也可以没有那个元素个数,后面全部都赋值,在这种问题上他俩是等价的,因为计算机可以通过后面元素的个数自动判断数组的长度。
如果后面涉及到数组元素的赋值 ,将两个数组的元素合并到一起这类问题时我们的第1个数组一定要规定好足够的数组元素
关于排序问题
1起泡法(相邻两个元素比较大树下沉,小树上浮。当然,如果我们改变比较的大于等于号方向。这就可以让小树下成大树上浮。)
我们说如果比较6个数就要比5躺,每趟都要比上一次少比一次,这很明显我们要用到双层循环外循环控制躺数,内循环控制次数,第1趟比5次,第2趟第4次,第J躺就是比J-6次,这是一种正向思路,还有一种逆向的,第1次不是比5次吗?那么我们就给控制变量先赋5(i=5)条件改成你定的电量大于0(i>),然后i--,内层循环j=0;j<i;j++这样也可以
二维数组
二维数组的初始化:可以在两个行和列都没有省略的情况下直接初始化,也可以在初始化的时候用好几个花口号括起来表示,第1个画括号是第1行的数,第2个画括号是第2行的数
与一维数组不同的是因为我们这里是两个,因为数组的元素个数可以省略,然后根据后边实际的数组内容来判断数组的元素个数,而我们在这里就不行了。我们只能省略行在省略行后,只要在后面用几个花口号来区分划分计算机就可知道有几行,但是列不能省略,因为二维数组在内丛丛也是连续存储的,如果你连一行是有几列都不知道给他分配内存的时候就不知道要怎么分配。
我们说一维数组只有一个下标和宿主名,唯一确定一个数。而二维数组就是由数组名和两个下标,唯一确定一个数。
我们理解二维数组的时候,将第1个下标定义为行数,将第2个下标定义为列数,arr[3][4]这个代表的就是这个数组是三行每行4列,所以说总共有12个元素。而每个元素都是由两个下标,唯一确定。只有解决了生活中的问题,比如说有三个小队,每个小队中有三个成员,第一小队的第1个成员的分数,第二小队的第2个成员的分数。,第3个小队第3个成员的分数,就可以用我们的宿主名和两个下表唯一确定,而下表又是从零开始,所以说第1行第1列就是arr[0][0]
还有我们说二维数组在内存中也是连续存放的,银行内部连续跨行也是连续的就像是每行用一根绳连起来的一样。这就是为了让我们好理解。从直观上来说,我们说是几行几列。而在计算机中它就可以识别出哪部分区域是第几行,所以它是连续存放的。
我们说二维数组也可以理解为一维数组
你前面那个定义的是几行,后面定的是每行几列,每一行中的第1个下标都是相同的所以说可以把宿主名加上第1个下标理解为这是宿主名而把第2个下标理解为这是一维下的元素个数,就可以理解为它是三个连续的数组。arr想成二位数组的名字,arr[]想成第2维的名字。所以对二位数字的理解就有了两种。
arr[5][5]
中出现arr[0]等它代表的是这一行数组元素的收集值。他是一个行地址
整形数组的初始化可以使用字符,因为字符在内容中是以十进制阿斯克码之虫子。,但这样写的有点浪,浪费内存。
字符数组
我们说字符数组:如果你只是给他赋字符的话,就要加上花括号,然后这个方面和数字型数组是一样的。但如果你给这个字符数组所负的字符后面加上\0的话,因为\0是字符串的结束标志,我们对字符串全部的操作,都是从字符串的第1个字符开始然后到杠铃结束所以杠铃是决定字符串的重要标志如果没有杠铃的话,是无法判断这个字符串的具体就说你给一个东西左右都卡住才能卡稳才能确定头都知道但是你得告诉人家尾,还有就是如果是初始化给他放字符串的话,就可以省略划括号,直接用双引号引起来,我们通过用strlen就说明了一个问题,如果你字符输出里面附的都是字符。而且无\0在判断字符串大小时就无法识别字符串是从哪里结束所以这样的话,strlen只能输出一个随机值。这就体现了字符串在设计时的优越性。他后面就隐藏了一个杠铃作为结束标识,我们在判断一个字符串时,都是读到杠铃,就大体知道了这个字符串的内容,在判断字符串大小的时候,因为杠铃是每个字符串都要带的东西。所以在判断字符串大小的时候就不会带上杠铃,而如果是计算它在内存中的字节大小,就要加上杠铃,因为他虽然是隐藏式,但计算机给它自动加的虽然隐藏,但他实际存在,他在内存中也算其实我们用的时候只用前面的,而杠铃就是作为结束标志,sizeof判断一个变量在内存中所占内存的大小的。单位是字节
用int sz=sizeof(arr)/sizeof(arr[0])
前面那个是数组的字节大小,后面是一个元素块所占的字节大小。所以这个算的就是数组的元素多少。\0既无动作也不显示,在定义字符串的时候会给它自动加上
字符数组以字符串形式%s输入或输出时,调用的是整个数组
对于scanf%s这个格式输入时,遇到空格或回车都要结束
与字符串有关的函数
puts(字符数组或字符串常量)
输出后换行,将\0自动转化为\n
gets(字符数组)将来要存放的字符串就要存放在这个字符数组里所以你在定义这个字符输入的时候,将它的大小尽量往大定一下
从键盘输入一个以回车结束的字符串放入字符这个与scanf不同它可以输入空格他只有遇到回撤的时候才结束输入将此字符串输入后自动给它加上\0
这个要注意的是这两个函数只能输出一个或输入一个字符串,就是说它的参数只是一个
字符串连接函数
strcat(字符数组1,字符数组2)
把字符数组二连到字符数数一后面。此函数的返回值是数组一的首地址,
- 要注意数组一要足够大。
- 连接前两串均以\0结束,连接后串1的\0取消,新串最后加\0
字符串拷贝函数Strcpy
Strcpy(字符数组1,字符串常量或字符数组)
- 该函数返回值是数组一的首地址
- 字符数组一必须以数组名形式(str)字符串2可以是字符数组名可或字符串常量。
- 拷贝时,'\0'一同拷贝,也就是说如果后面那个是字符串的话。拷贝过来还是字符串,要带上\0
- 不能使用赋值语句为一个字符数组赋值,因为它代表的是数组首先元素的地址,是一个地址常量。无法对他进行赋值
- 可以使复制字符串中的前几个字符,来取代字符数组1的前几个字符
字符串,长度函数strlen
strlen(字符数组或字符串常量)
计算字符串的长度,像这种进行操作的,只要遇到杠铃就代表他遇到了字符串的结束标志,后面即使再有字符也不会计算
该函数的返回值是字符串的实际长度不包括\0
大写字母转换成小写字母的函数strlwr
strlwr(字符串)
小写字母转换成大写字母strupr
strupr(字符串)
做题总结:你要引库函数头文件不能丢,因图文件是因为是头文件,所以加.h不能丢。
我们常说的数据类型是有范围的,就拿整形说,当这个值超过他时就会溢出符号位就会从0变成1。导致他变为负数
我们常说的可以再给定义变量时给其初始化,也可以在使用前给他赋值,但不赋值是不对的。不赋值的话它是个随机数。,这些题考在选择题中。判断输出结果是这个肯定就是不确定了。
scanf(*%d)前面如果加一个心的话,就是把他屏蔽了。不输入这个数
我们常说的常量表达式,就是有一些常量构成的表达式 ,它包括字符型和符号常量,和整形,我们现在学到了,循环的控制变量必须是整形,数组的下标必须是大于等于0的整形,定义数组时的元素个数必须是整形,注意字符型也属于整形 他在内存中是雅士卡玛之储存,switch也要用整形
语句后面的话不能丢,如果在其中遇到if,for,while后面直接加了个分号,就要注意了他们只能内切一条语句那如果后面直接下封号的话,就相当于加了一个空语句。那就会出现问题,比如你想执行的语句没有执行到。
在这里补充一下:对于二维数组来说,一定要记住它有两种理解方法。第1种知识理解它是几行几列,然后按行顺序存放,第2种理解方法是将二维数组看成一维数组,将前面的看成是他,因为数数的数组名,这时那个术数名代表的就是行地址,也就是说,如果你定的是个三行的话,就相当于有三个这样的一位数组,他们按顺序存放,对于字符数组在调用时只需要调用他的行地址,利用循环将每一行都可以放进一个字符串,
Strcpy 对于这个字符串函数,他就是说将后面那个字符串或字符数组给前一个复制进来。代替前面数组中的元素,我们可以通过这个函数在令一个数组,实现字符中元素的替换,字符数组在交换字符串的时候就可以通过这个函数来实现
本章实验题
1这是一个计算7行杨辉三角的程序,我们只需改变它的数组行列数,就可以扩大它的范围。
思路就是,①数组的每0列都为一,②第I行的第I列都为一③杨辉三角从第3炼开始,其中的值等于他肩膀上两个值的和,反映出来就是他上一行的前一列和上一行的这一列的和,④使用程序,给他使用二维数组,依次访问它的元素。用if语句如果满足上述条件就给他赋1不满足就看他就计算他接上的值并付给他。
以上是我写的一种比较笨的方法
2连接两个字符串这个比较简单,你就要记住你调用库函数它的作用也就是将第2个数组中的元素接到第1个数组中来。我们要实现的就是找到它的数组末,然后将另一个数组的元素给它赋过来。
第七章 函数
纸质总结
数组传参
数组名传参时要注意:我们是让形参数组指向我们实参数组的首元素的地址(指向同一块空间。)并没有说给他这个形式数组再分配一块存储空间。而是与实际参数共用一块空间并且开始都指向第1个元素对象是这一块空间。。所以他用下标访问的时候与实际参数。访问的元素一样的。访问的都是同一块空间,所以这是修改行参的值,我们的实际参数数组的内容也会改变。
对了,对于一维数组,它的形参中的那个元素个数可以省略,因为编译系统不检查长度可写可不写。arr[]但一般我们省略时需要另设一个参数,给他传一个我们需要处理的数组的元素个数。这也会使通用性增强。
并且数组名做行餐时和食餐两者共用一段内存单元都指向同一段空间。
在全局变量和局部变量中
我们知道全局变量是在函数外定义的而局部变量是在函数内定义的。
在函数外定义一个全局变量,如果在一个函数内又定义一个与它变量名相同的变量,用的时候是局部优先,这里我们说一下,还有一种情况。是在函数内定义的局部变量,它的下面如果还有复合语句里定义的这个局部变量与这个前面的定义的局部变量名重名时复合语句内的局部变量优先。
我们在定义一个变量时,研究的是两个方面
第1个是变量的数据类型。第2个是变量的存储类别。。
数据类型就是我们以前说的那些基本数据类型。而存储类别(有auto,Register,static,extern)
又分为全局的和局部的
全局变量
可以用static和extern来修饰
局部变量
可以用auto(这个是默认的)static,Register
全局变量和局部变量的记忆方法
对于全局变量,它的存储类别和生成期是天生定,作用域可用static和extern限制和扩展。
对于局部变量,作用于天生定,存储类别和生存期可用auto, register,static来进行修饰划分用3take修饰后,他的存储类别就是静态存储生存期是与全局变量的生存期是一样的,用register和auto 修饰后它的存储类别是动态存储,生存期与与它局部变量的作用域相同
指针
小目录:
指针的由来和概念
指针变量(指针类型的意义)
什么是野指针?
如何避免规避野指针?
指针的运算(3种)
数组指针(一维和二维数组,行指针列指针如何使用?和转化)存放行指针的数组指针变量。
指针数组
多级指针
指针与字符串(系统将字符串常量按照字符数组来对待和处理只不过这个字符串常量代表的字符数组无名字)的关系
指针与函数
空指针
指针的纸质总结
停
第9章结构体共用体枚举类型
纸质总结