周记(三)
来源:互联网 发布:apache windows 编辑:程序博客网 时间:2024/06/05 18:44
姓名
徐秀
周次
3
方向
3G
内
容
本周学习知识点:
(1)C语言中字符串的使用
(2)函数
(3)指针
本周学习收获:
(1)字符串的含义,字符串的保存及定义,
(2)字符串的基本操作,常见的字符串函数
(3)函数的作用及基本概念
(4)函数声明、定义和调用
(5)头文件及自定义头文件的方法,函数参数传递方式
(6)函数和变量的关系
(7)函数的嵌套调用,函数的递归调用
(8)const限定符在函数参数中的使用
(9)数组作为函数参数使用
(10)指针的概念、使用及运算
(11)一维数组与指针的关系
(12)指针与函数的关系
(13)函数指针的定义和使用
(14)字符指针和字符串指针的定义和使用
学习总结:
1.字符串
字符数组
字符数组中,字符串的字符存放在相邻的存储单元,每个字符占一个单元
可以用上面的方法给字符数组初始化,也可以用memset给数组清0
使用memset需加头文件#include<string.h>
说明:
1.定义字符数组时,应确保数组长度比字符串长度至少多1
2.未被使用的元素均被自动初始化为0
3.被初始化的字符数组可以省略长度,数组的长度是字符串的长度加1
4.’\0’代表ASCII码为0的字符(NUL)
从ASCII码表可以查到,ASCII码为0的字符不是一个可以显示的字符,而是一个“空操作符”,即它什么也不做
5.字符数组的输入输出可以有两种方法:
逐个字符输入输出(%c)
整个字符串一次输入输出(%s)
6.scanf函数中的输入项c是已定义的字符数组名,输入的字符串应短于已定义的字符数组的长度
7.格式化输入
可以用scanf()接收字符串,它不接收空格
格式:scanf(“%[n]s[%[n]s…]”, 字符数组1[,字符数组2,…])
8.其它输出函数:使用字符串函数时,在程序开头用#include <string.h>
输出字符串函数puts()
输出字符函数putchar()
2.函数
1)函数的基本概念
1.C语言函数
C语言是通过函数来实现模块化程序设计的。一个较大的程序应分为若干程序模块,每个模块实现一个特定的功能,这个模块称为子程序。
C的子程序是通过函数实现的,函数是C语言程序的基本单位。
C程序可由一个主函数和若干个其他函数构成
主函数调用其他函数,其他函数也可以互相调用
同一个函数可以被一个或多个函数调用任意多次
2.函数的分类:
1.从用户使用的角度
1)标准函数(库函数),由系统提供,用户不必自定义可直接使用,注意:不同C编译系统提供的库函数可能有些不同
2)用户自定义函数,用来解决用户专门需要。
2.从函数的形式
1)无参函数。在调用函数时,main不向被调用函数传递数据,只用来执行一组操作。
2) 有参函数,主调函数在调用被调用函数时,通过参数向其传递数据,一般情况下,执行被调用函数时,得到一个函数值,供主调函数使用
3.函数定义的一般形式
函数应当先定义,后调用
(1)无参函数的一般形式
函数类型 函数名()
{
说明语句部分;
可执行语句部分;
}
无参函数一般不需要返回函数值,函数类型void类型(空类型)
(2)有参函数的一般形式
函数类型 函数名( 形参表列 )
{
说明语句部分;
可执行语句部分;
}
(3)空函数定义
函数类型 函数名()
{
}
用空函数占一个位置,以后逐步扩充
好处:程序结构清楚,可读性好,以后扩充新功能方便,对程序结构影响不大
4.函数体:函数首部下用一对{}括起来的部分。如果函数体内有多个{},最外层是函数体的范围。
函数体一般包括声明部分、执行部分两部分。
1)声明部分:在这部分定义本函数所使用的变量和进行有关声明(如函数声明)。
2)执行部分:程序段,由若干条语句组成(可以在其中调用其它函数)
5.函数定义说明:
函数名是由用户定义的标识符, 它的命名规范有:
1.首字母必须大写
2.函数名用大小写字母组合, 即每个单词的首字母也大写
3.最好用下划线进行间隔
6.函数调用:
函数调用的一般形式为:
函数名(实参表列)
如果是调用无参函数,则“实参表列”可以没有,但括号不能省略
如果实参表列包含多个实参,则各参数间用逗号隔开
在一个函数被另一个函数调用时,须具备以下条件:
1)被调用的函数已存在
2)如果被调函数为库函数,则应在文件开头 用“#include”命令声明相应的 “头文 件”。如:
系统库文件 #include <stdio.h> #include <math.h>
用户自定义文件:#include "xxx.h"
3)如果被调函数为自定义函数且其定义在主调函数定义之后,则应在主调函数中说明其类型(即对被调用函数进行声明,否则编译警告:implicit declaration of function)。
7.自定义头文件
头文件是一种文本文件,使用文本编辑器将代码编写好之后,以扩展名.h保存就行了。
头文件中一般放一些重复使用的代码,例如函数声明,变量声明,常数定义,宏的定义等等。
函数声明:
函数声明的作用是把函数名、函数参数的个数和参数类型等信息通知编译系统,以便在调用时,编译系统能正确识别函数并检查调用是否合法。
函数声明又称函数原型。格式如下:
函数类型 函数名(参数类型1,参数类型2,…,参数类型n);
如果不声明,系统无法在调用时对函数调用的正确性进行检查,容易出错
8.函数的返回值:
通常,希望通过函数调用使主调函数能得到一个确定的值,这就是函数值(函数的返回值)
(1)函数的返回值是通过函数中的return语句获得的。
return语句后面的括号可以不要
(2) 函数值的类型。应当在定义函数时指定函数值的类型
(3)在定义函数时指定的函数类型一般应该和return语句中的表达式类型一致
如果不一致, 则以函数定义时为准, 自动进行类型转换
(4)在函数中允许有多个return语句, 但每次调用只能有一个return语句被执行, 只能有一个返回值
(5)无返回值的函数, 返回值可以明确定义为”空类型”, 但是不写返回值类型,默认为int.
当在函数中使用return语句返回后, 其后面的语句将不会被执行
2)函数和变量的关系
1.函数和变量的关系
1)变量的存储方式
从变量值存在的时间(即生存期)观察,变量的存储有两种不同的方式:静态存储方式和动态存储方式
静态存储 是指在程序运行期间由系统分配固定的存储空间的方式
动态存储 是在程序运行期间根据需要进行动态的分配存储空间的方式
不同变量内存区域分配(5个段作用)
2)全局变量和局部变量
在函数之外定义的变量是全局变量,在函数内定义的变量是这个函数的局部变量。局部就是只能在当前函数内使用,而全局变量可以在任何一个函数中使用。
注意:
一般而言,全局变量总是在所有函数之前定义,但如果某全局变量定义在两个函数之间,则定义处后面的函数可以使用,而其前面函数不能使用。
全局变量
全局变量对整个程序都是可见的它不属于某个函数,而属于整个源文件,一般在main()函数之前声明全局变量
如不初始化,系统自动初始化为0
静态变量:
静态变量随函数的定义而定义,如果已经存在就延用,但并不随函数的结束而消亡。在某一函数中定义的静态局部变量,不能在其它函数使用。
静态变量使用 “static 变量” 定义,是在程序加载的时候就为之分配内存的,一直到程序结束
3)函数的嵌套调用
1.C语言的函数定义是互相平行、独立的
即函数不能嵌套定义
但可以嵌套调用函数
即调用一个函数的过程中,又可以调用另一个函数
4)函数递归调用
1.递归的基本概念:
在调用一个函数的过程中又出现直接或间接地调用该函数本身,称为函数的递归调用。C语言的特点之一就在于允许函数的递归调用
递归可以把要解决的问题转化为新问题,新问题的解决方法与原来相同,只是规模有规律的递减
每个子问题必须比原来问题的规模更小,如果能够迅速减小更好
必须有一个明确的结束递归的条件
2.函数递归说明:
1、当函数自己调用自己时,系统将自动把函数中当前的变量和形参暂时保留起来,在新一轮的调用过程中,系统为新调用的函数所用到的变量和形参开辟另外的存 储单元(内存空间)。每次调用函数所使用的变量在不同的内存空间。
2、递归调用的层次越多,同名变量的占用的存储单元也就越多。一定要记住,每次函数的调用,系统都会为该函数的变量开辟新的内存空间。
3、当本次调用的函数运行结束时,系统将释放本次调用时所占用的内存空间。程序的流程返回到上一层的调用点,同时取得当初进入该层时,函数中的变量和形参 所占用的内存空间的数据。
4、所有递归问题都可以用非递归的方法来解决,但对于一些比较复杂的递归问题用非递归的方法往往使程序变得十分复杂难以读懂,而函数的递归调用在解决这类 问题时能使程序简洁明了有较好的可读性;但由于递归调用过程中,系统要为每一层调用中的变量开辟内存空间、要记住每一层调用后的返回点、要增加许多额外的 开销,因此函数的递归调用通常会降低程序的运行效率。
5)const在函数中的使用
1.const修饰函数参数
const修饰函数参数,表示函数内部不能对函数的参数进行修改
数组作为函数参数传入时,如不需要函数内部修改数组的值,可在数组前加const修饰
2.const修饰函数返回值:
对于按值返回的函数,由于函数的返回值本身是const类型的,所以一般不加const修饰
对于指针类型的返回值,如不希望通过返回的指针修改该指针指向的变量的值,需要在函数的返回值上加const修饰符
6)数组作为函数参数
数组元素作函数实参
数组名作函数参数
除了可以用数组元素作为函数参数外,还可以用数组名作函数参数(包括实参和形参)
用数组元素作实参时,向形参变量传递的是数组元素的值
用数组名作函数实参时,向形参 传递的是数组首元素的地址
多维数组名作函数参数
3.指针
(1)指针的基本概念
(1)计算机硬件系统的内存储器中,拥有大量的存储单元(容量为1字节)。为了方便管理,必须为每一个存储单元编号,这个编号就是存储单元的“地址”。每个存储单元都有一个惟一的地址。
内存地址──内存中存储单元的编号
(2)在地址所标识的存储单元中存放数据。
注意:内存单元的地址与内存单元中的数据是两个完全不同的概念。
变量地址──系统分配给变量的内存单元的起始地址
将地址形象化地称为“指针”
由于通过地址能找到所需的变量单元,因此说,地址指向该变量单元
将地址形象化地称为“指针”。意思是通过它能找到以它为地址的内存单元
(2)指针变量
一个变量的地址称为该变量的“指针”
如果有一个变量专门用来存放另一变量的地址(即指针),则它称为“指针变量”
(3)变量的值和变量的地址
地址运算符&
后面跟一个变量名时,&给出该变量的地址
间接运算符*
后面跟一个指针名或地址时,能取出存储在被指向地址中的数值
(4)使用指针的目的
要通过指针能够找到被指的变量,或者说要通过指针间接访问到被指的变量
(5)指针变量的定义:
定义指针变量的一般形式为:
类型 * 指针变量名;
在定义指针时,“*”号只能代表一个指针。
一个类型的指针只能指向同类型的变量,不能指向其他类型的变量。
指针也可以被声明为全局、静态局部和局部的。
(6)指针变量的初始化:
指针变量使用之前必须赋予具体的值,并且只能赋地址。
如果一个指针在定义后没有初始化,应该给它赋一个空值,避免出现使用未被初始化的指针引起的系统混乱。
(7)指针变量的赋值:
可以直接把一个变量的地址直接赋值给一个指针变量
在定义指针变量时,“*”代表是一个指针变量,而在指针赋值时,不能在指针变量前面添加“*”
指针变量的值不是一个整数,因此赋值时不允许把一个数赋值给指针变量
指针变量值的改变,相当与指针指向的改变
(8)指针变量的引用:
通过指针间接访问变量
在C语言中使用‘ * ’来表示取地址处的内容
注意:
a和b的值并未交换,它们仍保持原值
但p1和p2的值改变了。p1的值原为&a,后来变成&b,p2原值为&b,后来变成&a
这样在输出*p1和*p2时,实际上是输出变量b和a的值,所以先输出9,然后输出5
(9)void类型的指针:
void的指针可以指向任何的变量,但是在使用时,需要进行强制类型转换后才能使用
(10)指针运算:
所有类型指针变量的大小都是4个字节
指针之间的减法运算:
指针之间只有减法运算,没有其他运算
pnID – pnID1 = (pnID - pnID1 )/sizeof(指针指向类型)
(11)一维数组和指针的关系
1.数组元素指针
一个变量有地址,一个数组包含若干元素,每个数组元素都有相应的地址
指针变量可以指向数组元素(把某一元素的地址放到一个指针变量中)
所谓数组元素的指针就是数组元素的地址
可以用一个指针变量指向一个数组元素
注意:
注意:数组名a不代表整个数组,只代表数组首元素的地址。“p=a;”的作用是“把a数组的首元素的地址赋给指针变量p”,而不是“把数组a各元素的值赋给p”。
2.引用数组元素时的指针运算
在指针指向数组元素时,允许以下运算:
加一个整数(用+或+=),如p+1
减一个整数(用-或-=),如p-1
自加运算,如p++,++p
自减运算,如p--,--p
两个指针相减,如p1-p2 (只有p1和p2都指向同一数组中的元素时才有意义)
如果指针变量p已指向数组中的一个元素,则p+1指向同一数组中的下一个元素,p-1指向同一数组中的上一个元素。
3.通过指针引用数组:
引用一个数组元素,可用下面两种方法:
(1) 下标法,如a[i]形式
(2) 指针法,如*(a+i)或*(p+i)
其中a是数组名,p是指向数组元素的指针变量,其初值p=a
4.指针变量的赋值:
几个注意的问题:
指针变量可以实现本身的值的改变。如p++是合法的;而a++是错误的。因为a是数组名,它是数组的首地址,是常量。
要注意指针变量的当前值。(指针的正常回归)
5.指针变量的引用:
*p++,由于++和*同优先级,结合方向自右而左,等价于*(p++)。
*(p++)与*(++p)作用不同。若p的初值为a,则*(p++)等价a[0],*(++p)等价a[1]。
(*p)++表示p所指向的元素值加1。
如果p当前指向a数组中的第i个元素,则
*(p--)相当于a[i--];
*(++p)相当于a[++i];
*(--p)相当于a[--i]。
(12)指针与函数
1.数组名做参数:
用数组名作函数参数时,因为实参数组名代表该数组首元素的地址,形参应该是一个指针变量
C编译都是将形参数组名作为指针变量来处理的
实参数组名是指针常量,但形参数组名是按指针变量处理
在函数调用进行虚实结合后,它的值就是实参数组首元素的地址
在函数执行期间,形参数组可以再被赋值
2.指针变量作参数:
指针变量以实参的形式传递给函数,可以在函数中改变实参的值
3.字符及字符串指针:
字符数组表示字符串
注意:1.数组最后一个元素为‘\0’。
2.字符串的长度不要超过数组的大小,一般要确保数 组元素数比字符串长度多1。
4.引用字符串:
引用一个字符串,可以用以下两种方法。
(1) 用字符数组存放一个字符串,可以通过数组名和格式声明“%s”输出该字符串,也可以通过数组名和下标引用字符串中一个字符。
(2) 用字符指针变量指向一个字符串常量,通过字符指针变量引用字符串常量。
5.字符串指针变量与字符数组
字符数组和字符指针都可以存储和运算字符串
说明:1.数组名string1是常量,存放的是以‘\0’结束的字符串;
指针string2是变量,存放的是字符串的首地址。
2.可以将字符串直接赋给string2,而string1只能逐个元
素依次赋值。
6.指针变量的引用:
用字符数组的方式输出字符串
对授课教师意见建议:
- 周记(三)
- 周记(三)
- (三)
- (三)
- 三消游戏(三)
- IT之禅(三三)
- 三 序列式容器(三)deque
- 第九周项目三(三)
- 第十五周项目三:OJ(三)
- 三、runtime之消息(三)
- Hibernate(三):三种实例状态
- 三栏布局(三列布局)
- java三大特性:(三)多态
- TCP/IP (三)
- Prefer C++(三)
- 闲谈BCB(三)
- 幽雅BDE(三)
- eclipse 参考手册(三)
- JavaScript中的arguments,callee,caller,call,appy
- extern作用详解
- DynamicResource与StaticResource的区别
- 《TCP/IP协议详解:卷一》读书笔记---IP、UDP、TCP协议基础
- Visual Studio 2010——C#的LinkLabel控件的使用
- 周记(三)
- 《编程导论(Java)》电子参考文献索引
- 周记(四)
- 开发者使用JasperReport——通过数据源生成报表
- poj 动态规划题目列表
- 调试技巧
- HDU 2159 FATE
- 周记(五)
- error 25541 failed to open xml file c:\windows\microsoftnet\framework\v4.0.30319\config\ machine.con