C语言之函数和数组
本帖最后由 Triste 于 2016-3-18 10:36 编辑由于要学习数据结构和算法,不可避免的需要用到C语言,这几天又重新整理了一下之前的笔记,发现很多原来不了解的东西现在已经非常清楚了,同时也有了不少全新的体会。这反倒激起了我再系统看看C语言的欲望,毕竟它是程序语言的老大哥。
之前已经说完了最基础的东西,剩下的知识点我也会一一用文章记录,这样的感觉很好,有一些记录可以方便以后查看,否则很多东西学完了不用就忘了,完全没有了,下次要记忆起来还需要付出挺多代价。
1.什么是函数?
函数是一块能够完成特定功能的独立的代码,接收零个或多个参数,做一件事情,并返回零个或一个值。它是一个工具,为了解决大量类似问题而设计的,在不考虑内部如何实现的情况下,可以把它当做一个黑匣子。
2.函数的定义格式
函数定义的本质是详细描述函数之所以能够实现某个特定功能的具体方法。
函数返回值的类型也称为函数的类型,如果函数名前的返回值的类型和函数执行体中的return表达式中表达式的类型不同的话,则最终函数返回值的类型 以函数名前的返回值类型为准。比如下面这个函数,因为定义的返回值类型是int,所以最终fn返回的是10而不是10.5。
3.函数的调用格式:函数名(参数值)
( )起到了表示函数调用的重要作用,即使没有参数也需要( )。
如果有参数,则形参和实参的个数相同,位置一一对应 ,数据类型必须相互兼容,这些值会被按照顺序依次用来初始化函数中的参数。如果传入的参数类型和声明的参数类型不一致,会按照声明的参数类型来。
4.return表达式的含义
<1>终止被调函数,向主调函数返回表达式的值
<2>如果表达式为空,则只终止函数,不向主调函数返回任何值
5.函数的分类:
有参函数 和 无参函数 有返回值函数 和 无返回值函数 库函数 和 用户自定义函数
值传递函数 和 地址传递函数 普通函数 和 主函数(main函数)
一个程序必须有且只能有一个主函数,主函数可以调用普通函数,普通函数不能调用主函数。普通函数之间可以相互调用。主函数是程序的入口,也是程序的出口。
6.函数调用和函数定义的顺序
如果函数调用写在了函数定义的前面,则必须加函数前置声明,因为编译器自上而下分析代码,在看到函数调用的时候,它必须知道函数是什么样子。
函数前置声明:
把函数头复制,放到main( )函数之前,最后加上分号即可,这句声明也叫做函数原型。因为函数声明是一个语句,所以末尾必须加分号。另外,函数声明可以不写参数的名字,但是一般还是选择写上。
<1>告诉编译器即将可能出现的若干个字母代表的是一个函数
<2>告诉编译器即将可能出现的若干个字母所代表的函数的名称,参数和返回值的具体情况。
<3>对库函数的声明是通过 # include <库函数所在的文件的名字.h>来实现的。
7.C语言在调用函数的时候,永远只能传值给函数。每个函数都有自己的变量空间,在这个空间中的变量,是函数的这次运行所独有的,称作本地变量,定义在函数内部的变量就叫做本地变量。参数也位于这个独立的空间中,和其他函数没有关系,所以参数也是本地变量。
8.变量的生存期和作用域。
生存期:什么时候这个变量开始出现了,到什么时候它消亡了。
作用域:在什么范围内可以访问这个变量,这个变量可以起作用。
对于本地变量,这两个问题的答案是统一的:大括号之内。
9.本地变量的规则
本地变量是定义在“块”内的,可以是函数的块,也可以是语句的块,比如if语句。
程序进入这个块之前,块中的变量不存在,离开这个块,其中的变量就消失了。
在块外面定义的变量,到块里面仍然有效。
如果块里面定义了和块外面同名的变量,则里面的会覆盖外面的。
不能在一个块内定义同名的变量。
本地变量不会被默认初始化,而参数在进入函数的时候会被初始化。
10.关于函数的一些细节
当函数不传递参数的时候,括号中写上void更好。
调用函数的时候,圆括号中的逗号是标点符号,不是逗号运算符。
C语言不允许函数的嵌套定义。
11.为什么需要数组?
为了解决大量同类型数据的存储和使用问题。为了模拟现实世界。
12.定义数组
<类型>变量名称[元素数量],元素的数量必须是整数。从C99标准开始,可以用变量来定义数组的大小。
特点:所有元素具有相同的数据类型,一旦创建,不能改变大小;所有元素所占的字节大小相等;数组中的元素在内存中是连续依次排列的。
如果用sizeof求数组的长度,给出的是整个数组所占据内容的大小,单位是字节。如果数组的名字是a,那么sizeof(a)/sizeof(a)得到的就是数组长度。
13.关于一维数组的操作
一维数组的数组名不代表数组中所有的元素,它代表的是数组第一个元素的地址。
完全初始化,可以枚举或者使用循环
不完全初始化,未被初始化的元素自动为零
不初始化,所有元素中都是垃圾值
清零或者统一填充为相同的值。
错误写法:只有在定义数组的同时才可以整体赋值,其他情况下整体赋值都是错误的。
错误写法:没有a这个元素,从a开始,最大只有a
错误写法:如果要把a数组中的值全部复制给b数组,不能直接相等。
正确的写法
14.数组下标问题
数组的有效下标是0到数组的长度减1,但是无论是对数组单元读还是写,编译器和运行环境都不会检查数组的下标是否越界。一旦程序运行,越界的数组访问可能造成问题,导致程序崩溃,但是也可能运气好,没有造成严重的后果。
15.随机输入0到9,直到输入-1结束,统计某个数字一共被输入了几次。
16.集成初始化时候的定位,只有C99才可以这样做,这种方式特别适合初始数据稀疏的数组。
用在初始化数据中给出定位,没有定位的数据接在前面的位置后面,其他位置补零。也可以不给出数组的大小,让编译器算。比如上图代表的意思是a的值为2,a的值为3,紧跟着a的a的值为6,剩下的其他元素的值都是0。
17.当数组作为函数的参数时,往往需要另外一个变量来传入数组的大小。我们不能在[]中给出数组的大小,不能再利用sizeof来计算数组元素的个数。
18.构造素数表
<1>令x=2
<2>将2x,3x,4x直到ax
<3>令x为下一个没有被标记为非素数的的数,重复2,直到所有的数都尝试完毕。
伪算法
<1>开辟prime,初始化其所有元素为1,prime为1表示x是素数。
<2>令x=2
<3>如果x是素数,则对于(i=2;x*i
<4>令x++,如果x
19.二维数组
int a,通常理解成a是一个三行五列的矩阵,a表示第i+1行第j+1列的元素。int a这个二维数组右下角位置的元素只能是a。
20.二维数组的初始化
21.二维数组的遍历,使用两层for循环。
22.多维数组
不存在多维数组,因为内存是线性唯一的。
n维数组可以当做每一个元素是(n-1)维数组的一维数组。
转自:http://blog.sina.com.cn/s/blog_12ce411a90102w7tq.html
页:
[1]