C语言笔记

命令、程序、软件的概念

程序:一推符合语法规则的指令集合。

命令即指令:也称为程序语句,是组成C语言程序的基本条件。

软件:是一系列按照特定顺序组织的计算机数据和指令的集合。

C语言源程序的结构特点

(1)一个C语言源程序可以由一个或多个源文件组成。

(2)每个源文件可由一个或多个函数组成。

(3)一个源程序不论由多少个文件组成,并且只有一个main函数,即主函数。

(4)源程序中可以有预处理命令(include命令仅为其中一种,预处理命令通常应放在源文件或源程序的最前面。

(5)每一个说明,每一个语句都必须以分员结尾,但预处理命令、函数头和花括号“}”之后不能加分号。

(6)标识符,关键字之间至少加一个空格以示间隔,若已有明显的间隔符,就可以不加空格来间隔。

C语言的原型ALGOL 60语言(也称为A语言)

C语言的特点

1. 简洁紧凑,灵活方便
  
2. 运算符号丰富
  
3. 数据结构丰富
  
4. C语言是结构式语言
  
5. C语言语法限制不太严格,程序设计自由度大
  
6. C语言允许直接访问物理地址,也可以直接对硬件进行操作
  
7. C语言程序生成代码质量高,程序执行效率高
  
8. C语言适用范围广,可移植性好
  

常见C语言头文件

头文件                                说明

<math.h>                           包含数字运算函数

<stdio.h>                         包含标准输出和输入函数

<stdlib.h>                       标准函数库,包含各类基本函数

<string.h>                       包含字符串处理函数

<time.h>                            包含时间、日期的处理函数

# 注释

1. 单行注释:在行内以“//”开始,到行尾结束。
  
2. 多行注释:它是以“/*”作为开头,“**/”作为结束,并且可以出现在程序的任何地方。
  

# 常量:define        常变量:const float

1. 在程序运行过程中,其值不能改变的量称为常量。

    #define x 15   代表常量x的值为15

# 变量:float

所谓变量,是具有名称的一块内存空间,用来存储可变的数据

## 变量的命名规则

1. 变量名只能由字符、数字和下划线组成
  
2. 变量名不能以数字开头
  
3. C预言保留字不可用作变量名,如if、return、int等
  

# 基本的数据类型

## 整形、浮点型、字符类型

整形(整形变量)

整形变量是以在内存中的存在形式存放的

整形变量的分类

        基本类型:以 int 表示

        短整型:以 short int 或者 short 表示        范围:[-32768,32768]

        长整型:以 long int 或者 long 表示            范围:[-2147483648,2147483648]

        无符号短整型范围:[0,4294967259]

        无符号长整型范围:[0,4294967259]

浮点型数据

浮点数数据类型指的就是带有小数点的数字,也就是数学上所指的实数

浮点数的表示方法:

1. 小数点方式
  
2. 科学技术方式
  

单精度浮点数(float)

 声明为 float 单精度浮点数长度为4个字节,有效范围为 1.2**10^-31~3.4****10^31

如果想要将数值设置为float类型,必须再数值的末尾加上 "F" 或者 "f"

例如:float PI =3.14159F

            float PI =3.14159f  

双精度浮点数(double)

double 双精度浮点数数据长度为8字节,有效范围为 2.2*10^-61~1.8*10^61

不论是 float 单精度浮点或 duble 双精度浮点数,当用 print() 函数输出时 ,所采用的格式化字符都是 “%f”,”%f“和”%d“是一样的作用

如果以科学计数法的形式输出时,则格式化字符为 ”%e“

字符型数据

字符型数据包括字符常量和字符变量

字符常量

字符常量是用单引号括起来的一个字符

例如:'a' , 'b' , '=' , '+' , '?'

字符常量的特点

* 字符常量只能用单引号括起来,不能用双引号或其他括号
  
* 字符常量只能是单个字符
  
* 字符可以是字符集中的任意字符
  

数字被定义为字符型之后,参与数值运算时将使用该数字字符的ASCII值

如 ‘5’ 和 5 是不同的。‘5’ 是字符常量,常与运算时使用 ASCII 值 53

字符变量

字符变量的类型说明符时 char

字符变量类型定义的格式和书写规则都与整型变量相同。 例如:char a,b

字符:%c             整数:%d            浮点数:%f

转义字符

转义字符时一种特殊的字符常量

| 转义字符 | 转用字符的意义 |
| --- | --- |
| \n  | 回车换行 |
| \t  | 横向跳到下一制表位置 |
| \b  | 退格  |
| \r  | 回车  |
| \f  | 走纸换页 |
| \\\ | 反斜线符”\“ |
| \‘  | 单引号符 |
| \‘’ | 双引号符 |

运算符

算术运算符

算术运算符时程序语言中使用率最高的运算符,包含了四则运算、操作符、正负号、运算符和 % 取模运算符等

| 运算符 | 说明  | 使用语法示例 |
| --- | --- | --- |
| +   | 加   | A+B |
| -   | 减   | A-B |
| *   | 乘   | A*B |
| /   | 除   | A/B |
| %   | 取模(取余) | A%B |
| +   | 正号  | +A  |
| -   | 负号  | -B  |

注意:取模算术运算符 % 只能用来计算两个整数相除后的余数。

如果有小数,则用     fmod(a,b)

例如:     float    f=fmod(10.3 , 3.2)

                printf("%f" ,f)

关系运算符

 关系运算符的功能时比较两个数值之间的大小关系,通常用于流程控制语句。

由于 C 语言中没有特别定义布尔类型,进行关系运算后,所运算的结果只有“真”和“假”两种情况。

| 运算符 | 说明  | 使用语法示例 |
| --- | --- | --- |
| >   | 大于  | A>B |
| <   | 小于  | A<B |
| >=  | 大于等于 | A>=B |
| <=  | 小于等于 | A<=B |
| ==  | 等于  | A==B |
| !=  | 不等于 | A!=B |

逻辑运算符

逻辑运算符是用来判断基本的逻辑运算,C 语言编译系统在给出逻辑运算结果时,以 0 代表“假”,以 1 代表“真”

“&&” 和“||” 运算符的运算规则和比较运算符相同,是由左至右;“!” 运算符则是由右至左。

* &&(逻辑与)运算符

                当&&运算符两边的表达式都为真(1)时,其运算结果才为真(1),任何一边为假(0)时,运算结果都为假(0)

* ||(逻辑或)运算符

                当||运算符两边的表达式只要其中一边为真(1)时,其运算结果就为真(1)。当两边结果都为假(0)时,其运算结果为假(0)

* !(逻辑非)运算符

                !运算符时一元运算符,它会将比较表达式的结果进行反向输出

赋值运算符

    赋值运算符事 “=” ,其作用事将赋值运算符右侧的表达式的值赋给其左侧的变量。(赋值运算对象中的左侧对象一定事变量)

错误的赋值格式:

       (1) 复制号“=”的左边不允许出现常量或表达形式(不包括合法的指针表达式)

    c = a+b =3;-------错误格式
    a+b = c;-----------错误格式
    a=b=3=c;---------错误格式

        (2)不能给未定义的变量(未开辟的空间)赋值

    如:int a; a=5;k=5-----------根本没定义变量k,何来赋值一说?编译错误!

        (3)变量未明确赋值不能参与运算

    如:int a,b,c;c=a+b

复合运算符

     在赋值符“=”之前加上其他运算符,可以构成复合的运算符。

            如果在“=”前加一个“+”运算符就成了符合运算符“+=”

    例如:a+=3 --------a=a+3
         x*=y+8-----x=x*(y+8)
         x%=3 -------x=x%3

自增/减运算符

    这是一类特殊的运算符,自增运算符(++)和自减运算符(--),是对变量自身的值增加1和减少1。

    例如:--count;这里相当于count = count - 1;(先自减后再运算)
         count--;这里相当于count = count - 1;(先运算后再自减)
         ++amount;这里相当于amount = amount + 1;(先自加后再运算)
         amount++;这里相当于amount = amount + 1;(先运算后再自加)

条件运算符

条件表达式的一般形式:

    exp1 ? exp2:exp3

条件运算符 (?:) 有三个操作数,故我们将其称为三目运算符

这个条件表达式的意思是:如果 expl 为真,则运算 exp2 ,整个条件表达式的值为 exp2 的值;反之,则运算 exp3,整个条件表达式的值为 exp3 的值。

逗号运算符(顺序求值运算符)

表达式一般形式为:

    表达式1,表达式2
    求解过程:先求解表达式1,再求解表达式2

求字节运算符

sizeof:用于计算变量或某种类型的量在内存中所占的字节数。

使用方法:

用于数据类型:使用形式:sizeof(type)

数据类型必须用括号括住。如:sizeof(int)

用于变量:使用形式:sizeof(var_name)或sizeof var_name

变量名可以不用括号。如:“sizeof(变量名)”,“sizeof 变量名”等都是正确形式

判断语句

if 语句

if 语句的一般形式

    如果表达式的值为非0,则执行语句1,否则跳过语句1继续执行下面的语句。
    if (表达式)
    语句1;
    如语句1出需要执行多条语句时,必须使用花括号“{}”把这些语句包括在其中。
    if (表达式)
    {
        语句体
    }

if --else 语句

    除了可以指定在条件为真时执行某些语句外,还可以在条件为假时执行另一段代码。
    if (表达式)
        语句体
    else
        语句体

### 多重选择 if--else--if 语句

    前二种形式的 if 语句一般都用两个分支的情况,当有多个分支选择时,可采用 if--else--if语句,其一般形式为:
    if (表达式1)
        语句1;
    else if (表达式2)
        语句2;
    ······
    else if (表达式m)
        语句m;
    else
        语句n;

其语义是:依次判断表达式的值,当出现某个值为真时,则执行其对应的语句,对应的语句执行完后,整个 if 语句执行也就结束了,将跳出整个 if 语句之外继续执行 if 语句之后的其他语句。

### 嵌套 if 语句

    条件语句时可以嵌套,当 if 语句中的执行语句又是 if 语句时,则构成了 if 语句嵌套。

1. 在简单的 if 语句中嵌套 if 语句
  
2. 只有 if 子句中嵌套 if 语句
  
3. 只在 else 子句中嵌套 if 语句
  
4. 在 if 子句和 else 子句中同时嵌套 if 语句
  

## 函数

### printf 函数

printf () 函数是格式化输出函数,一般用于向标准输出设备按规定格式输出信息。

printf () 函数的调用格式为:printf(“<格式化字符串>”,<参量表>)

格式化字符串包括两部分:

1. 正常字符,这些字符将按原样输出;
  
2. 格式化规定字符,以“%”开始,后跟一个或几个规定字符,用来确定输出内容格式
  

#### 1、格式字符串

格式字符串的一般形式为:

%[*][输入数据宽度][长度] 类型

##### (1)类型:表示输入数据类型,其格式符意义如下:

| 格式字符 | 字符意义 |
| --- | --- |
| d   | 输入十进制整数 |
| o   | 输入八进制整数 |
| x   | 输入十六进制整数 |
| f / lf 或 e | 输入实型数(用小数形式或指数形式) |
| c   | 输入单个字符 |
| s   | 输入字符串 |

(2) “*” 符:用以表示该输入项读入后不赋予相应的变量,即跳过该输入值。

    scang("%d %*d %d",&a,&b);
    当输入为“123”时,把1赋予a,2被跳过,3赋予b

(3)宽度:用十进制整数指定输入的宽度(即字符数)

    scanf("%5d",&a);
    输入:12345678
    只把12345赋予变量a,其余部分被截去。
    又如
    scanf("%4d%4d",&a,&b);
    输入12345678
    将把1234赋予a,而把5678赋予b

(4)长度:长度格式符为 l 和 h,l 表示输入长整数数据(如%ld)和双精度浮点数(如:%lf)

                h表示输入短整形数据

使用 scanf 函数还必须注意以下几点:

(1) scanf 函数中没有精度控制,如:scanf("%5.2f , &a");是非法的。不能用此语句输入小数2位的实数。

(2) scanf 中要求给出变量地址,如果给出变量名则会出错。如:scanf("%d , a")是非法的,应改为 scanf("%d , &a")才是合法的。

(3)在输入多个数值数时,若隔世控制串中没有非格式字符作输入数据之间的间隔则可用空格、TAB或回车作间隔。C语言编译器在碰到空格、TAB、回车或非法数据(如对“%d”输入“12A”时,A即为非法数据时)即认为该输入结束。

(4)多个 scanf() 函数连续给多个字符变量输入时的问题

### gatchar 函数

gatchar () 函数也是从键盘(标准输入设备)上读入一个字符,并带回显(这里的回显是指:当getchar() 函数从键盘读入一个字符后将会得到的字符显示屏幕上)。

    getchar 函数的调用格式
    变量名 = getchar();

#### 使用 getchar 函数应注意的几个问题:

(1)getchar 函数只能接收单个字符,输入数字也按字符处理。输入多余一个字符时,只接收第一个字符,比如在例4-6中,用户输入为“SEC",但时输出的仅仅只是第一个字符 ' s '。

(2)使用本函数前必须包含头文件“stdio.h"

puts 函数:只能输出字符串并换行

get 函数:只能接受字符串

### putchar 函数

putchar() 函数是向标准输出设备输出一个字符,其调用格式为:putchar(ch);

其中 ch 为一个字符变量和常量。使用 puthar() 函数前必须包含 stdio.h 头文件

putchar() 函数的作用等同于 printf("%c",ch);

### switch语句

    语法结构
    
    switch (表达式、变量、常量)
    
    {
        case 常量1:语句1;break;
        case 常量2:语句2;break;
    }
    default:默认语句

1. 计算表达式的值
  
2. 依次与 case 项常量匹配,匹配成功则执行对应的语句
  
3. 所有 case 项都不匹配,默认执行 default 项(如果有)
  

说明:

(1)在 C 语言中 switch 后面括号内的表达式必须时整型、字符型或枚举型

(2)每一个 case 的常量表达四的值必须互不相同,否则就会出现相互矛盾

(3)各个 case 和 default 的出现次序不影响执行结果

(4)各语序列允许有多条语句,不需要按复合语句处理,若语句序列 i 为空,则对应的 break 语句可以去掉

### while 循环

while 循环的一般形式为:

    while (条件表达式)
    {
        语句块或循环块;
    }

当语句块中只有一条语句时,花括号可以省略

while 语句时一个循环控制结构,循环中每一次都执行的语句被称为循环体。

### do-----while 循环

do-----while 循环的一般式

    do
    {
        语句块或循环体;
    }while (条件表达式)

这个循环与 while 循环非常类似

不同之处在于:do----while 循环时先执行循环体中的语句,然后再判断循环条件是否为真,如果为真则继续循环,如果为假,则终止循环。因此,do-----while 循环至少要执行一次循环语句。

### break 语句

break 语句的一般形式

    break:

当 break 语句用于 do----while 、while 以及我们后面会讲到的 for 循环语句中时,可使程序终止循环,从而执行循环后面的语句,通常 break 语句总是与 if 语句联在一起。即满足特定条件时便执行 break 语句跳出循环。

### continue 语句

continue 语句只能用在循环体中,其一般形式是:

    continue;

continue 是指结束本次循环,进入下次循环,即不再执行循环体中 continue 语句之后的语句,转入下次循环条件的判断与执行。

注意:本语句只结束本层次的循环,并不跳出循环。

exit 函数

exit 函数的一般形式:

exit (state)

exit 函数用于在程序运行的过程中随时结束程序。 exit 的参数 state 将返回给操作系统,返回 0 表示程序正常结束,非 0 表示程序非正常结束。

exit 函数通常是用在子程序中用来终结程序用的,使用后程序自动结束并跳回操作系统。

### for 循环

for 循环的一般形式

for (表达式1;表达式2;表达式3)

{

    语句块或者循环块;

}

表达式1:可以用来初始化循环变量,且仅仅在循环开始时循环一次

表达式2:用来测试是否继续循环(循环条件是否成立)

表达式3:一般用来更新循环变量    

#### for 循环的执行过程和特点

(1)先求表达式1。

(2)求表达式2为真(值为非0),则执行 for 循环体或语句块中的语句;若表达式2值为假(值为0),则结束循环,转到第5步。

(3)求解表达式3。

(4)转回上面第(2)步骤继续执行。

(5)结束循环,执行 for 循环后面的其他语句。

#### 在使用 for 循环时应注意一下几点

(1)for 语句的一般形式中“表达式1”可以省略,此时应在 for 语句之前给循环变量赋初值。注意省略表达式1时,其后的分号不能省略。如 for (; i <= 100; i++) {......};

(2)如果表达式2省略,即不判断循环条件,循环无终止地循环下去,也就是认为表达式2始终为真。当然,你也可以在循环体内通过 break ,return 等强行执行跳出循环。

### 循环嵌套

循环体里面也可以有循环,这就是所谓的循环嵌套。

# 数组

## 什么是数组

数组是一组有序的数据、类型相同的数据集合

数组元素的类型就是数组的类型,可以有整形数组、实型数组、字符型数组、指针型数组、结构型数组等。

给数组命名同给其他变量命名一样,应该遵循标识符命名规则

总结:

(1)数组中的元素类型必须相同

(2)数组的长度一旦指定就不能改变

(3)数组中的值通过数组名和下标组合起来进行访问

## 数组的存储机制

(1)数组元素具有相同的数据类型

(2)在内存中,数组均由连续的存储单元组成,最低地址对应于数组的第一个元素,最高地址对应最后一个元素,数组可以是一维的,也可以是多维的。

## 怎样定义数组

### 一维数组的定义方式为:

类型说明符数组名 [常量表达式];

(1)类型说明符是任一种基本数据类型或构造数据类型

(2)数组名是用户自定义的数组标识符

(3)方括号中的常量表达式表示数据元素的个数,也称为数组长度

#### 对数组类型说明应注意以下几点:

(1)数组的类型实际上是指数组元素的取值类型。对于同一个数组,其所有元素的数据类型都是相同的。

(2)数组名的书写规则应符合标识的书写规定。

(3)数组名不能与其他变量名相同。如:int a=5 ; char a[3];

(4)方括号常量表达式表示数组元素的个数,如 a [5] 表示数组 a 有5个元素。但是其下标从 0 开始计算。因此5个元素分别为 a[0] ,a[1] ,a[2] ,a[3] ,a[4] 。

(5)不能在方括号中用变量来表示元素的个数,但是可以是符号常量或常量表达式。

    例如:用常量表达式定义数组大小
    # define SIZE 5
    void main()
    {
        int a[5+4],b[z*SIZE];    //正确,方括号内可放常量或常量表达式
    }
    
    
    使用符号常量,一般常量定义数组大小是合法的。但是下列代码表示是错误的。
    void main()
    {
        int a=20;
        int b[a];    //方括号内不能放变量或变量表达式
    }

(6)允许在同一个类型说明中,声明多个数组和多个变量

    例如:
    int a,b,c,d,m1[13],m2[24];

## 怎样引用数组元素及数组元素的机制

1、数组元素

        数组元素是组成数组的基本单元。数组元素也是一种变量,其标识符方法为数组名后跟一个下标。下标表示了元素在数组中的顺序号。

2、数组元素的引用

    引用数组元素的一般形式为:
    数组名[下标]
    数组名[下标]
    其中下标只能为整型常量或整型表达式。如为小数时,c语言编译将会自动取整。
    例如 :a[5];a[i+j];a[i++]都是合法的数组元素。        

注意:

在 C 语言中自能逐个使用数组元素,而不能一次引用整个数组

    例如:输出有10个元素的数组必须使用循环语句逐个输出各个数组元素
    for(i=0;i<10;i++)
        printf("%d",s[i]);  对
        printf("%d",s);     错

引用素组元素的方法称为 “下标法” ;还有 “指针方式” 又称 “指针法”

3、引用数组元素的机制

数组名的含义:始终代表数组的首地址,是一个常量

数组的缺点:速度比普通变量慢

## 怎样将数组元素赋值及初始化

        数组元素和变量一样,可以在定义时赋予初值,称为数组的初始化。数组元素赋初值的方法相似,也是在定义时给出数组元素的初值,其格式是将各初始值按元素排列顺序一次写在一个花括号内,并用逗号隔开。

1、完全列举法

    int a[5] = {1,2,3,4,5}
    char b[6] = {'c','d','i','n','a','.'}

2、部分列举法

    int a[5]={1,2,3};
    // 此时对数组 a 的前3个元素进行了赋值,后两个的初值自动设为了零。如果是字符型整数组,没有指定值的元素自动设成 ASCII 码为  零的字符

3、省略大小列举法

    int a[]={1,2,3,4,5};
    // 虽然没有指定数组的大小,系统会根据花括号内数据的个数自动确定数组的大小。

下列几种初始化数组是错误的

        只有在进行带初始化的数组说明时才允许省略长度,在仅进行说明而没有初始化时,省略长度是错误的,因为编译器无法知道这个数组究竟有多大。如: int a[];

        初始化数据的个数不能大于数组长度,空格也是一个字符。

    如:char c[b]={'C','H','I','N','A','N',' ','C',' '}

## 简单使用字符串

    char c[]={'H','e','I','I','O',',',',','s','E','C','!'};
    其实在 C 语言中,字符串就是字符数组。所以可以这样表示:
    char c[]="Hello,SEC!";

## 冒号排序算法的实现

        根据轻气泡不能在重气泡以下的原则,从下往上扫描组 R ,凡扫描到违反本原则的轻气泡,就使其向上“漂浮”。如此反复进行,直到最后任何两个气泡都是轻者在上,重者在下为止。

# 函数

## 什么是函数?

函数是一个独立的子程序,由相关代码组成,能完成一定的功能,能完成一定的功能,能重复多次使用。

## 为什么使用函数?

为了减少代码冗余,增强代码的可读性,提高程序的可维护性。

## 函数的分类

### 1、从函数定义的角度看,函数可分为库函数和用户定义函数两种

#### (1)库函数(标准)

        由C系统提供,无须用户定义,也不必再程序中作类型说明,只需在程序前包含有该函数原型的头文件即可在程序中直接调用。如:printf、scanf、getchar、putchar等

#### (2)用户定义函数

        由用户按需要编写的函数。对于用户自定义函数,不仅要在程序中定义函数本身,而且在主调函数模块中还必须对该被调函数进行类型说明,然后才能使用。

### 2、C 语言的函数兼有其他语言中的函数和过程两种功能,从这个角度看,又可把函数分为有返回值和无返回值函数两种。

#### (1)有返回值函数

        此类函数调用执行完后将向调用者返回一个执行结果,称为函数的返回值。    

        如:数字函数。由用户定义的这种要返回函数值的函数,必须在函数定义和函数说明中明确返回值类型。

#### (2)无返回值函数

        此类函数用于完成某项特定的处理任务,执行完成后不向调用者返回函数值。这类函数雷士于其他语言的过程。由于函数无须返回值,用户在定义此类函数时可指定它的返回值为 “空类型” ,空类型的说明符为 “void”。

### 3、从主调函数和被调函数之间数据传送的角度来看,又可分为无参函数和有参函数两种。

#### (1)无参函数

        函数定义、函数说明及函数调用中均不带参数。主调函数和被调函数之间不进行参数传送。此类函数通常用来完成一组指定的功能,可以返回或不返回函数值。

#### (2)有参函数

        也称为带参函数。在函数定义及函数说明时都有参数,称为形式参数(简称为形参)。

        在函数调用时也必须给出参数,称为实际参数(简称为实参)。进行函数调用时,主调函数将把实参的值传送给形参,供被调用函数使用。

### 4、C语言提供了极为丰富的库函数,这些库函数又可从功能角度作以下分类

### (1)字符类型分类函数

        用于对字符按 ASCII 码分类:字母、数字、控制字符、分隔符、大小写字母等。

### (2)转换函数

        用于字符或字符串的转换;在字符量和各类数字量(整型等)之间进行转换;在字母大、小写之间进行转换。

### (3)目录路径函数

        用于文件目录和路径操作

### (4)诊断函数

        用于内部错误检测

### (5)图形函数

        用于屏幕管理和各种图形管理

### (6)输入输出函数

        用于完成输入输出的功能

### (7)接口函数

        用于DOS,BIOS和硬件接口

### (8)字符串函数

        用于字符串操作和处理

### (9)内部管理函数

        用于内存管理

### (10)数字函数

        用于数字函数计算

### (11)日期和时间函数

        用于日期,时间转换操作

### (12)进程控制函数

        用于进程管理和控制

### (13)其他函数

        用于其他各种功能

## 函数的三大特征

### 1、函数名

        函数名代表函数的入口地址,指出了函数的位置

### 2、函数的返回值类型

        函数的返回值是指调用函数时从函数中得到的值,指定了返回值的类型

### 3、函数的参数类型和数目

        指定了调用函数时要向函数传递的数据的类型和数目

## 怎么定义一个函数

    无参函数的一般形式
    
    类型说明型  函数名()
    
    {
    
        语句
    
    }
    

类型说明符和函数名称为函数头

类型说明符指明了本函数的类型,函数的类型实际上时函数返回值类型

函数名是由用户定义的标识符,函数名后有一个空括号,其中无参数,但括号不可少。

{}中的内容称为函数体

## 有参函数的一般形式

    有参函数的一般形式
    类型说明符  函数名(形式参数表)
    {
        语句部分
    }

有参函数仅比无参函数多形式参数表

在定义函数时参数列表称为形式参数,它们可以是各种类型的变量,各参数之间用逗号间隔。

在进行函数调用时,主调好书将赋予这些形式参数实际的值

形参既然是变量,当然必须给以类型说明。

## 怎样调用函数

    函数调用的一般形式;
    函数名([参数值1,参数值2-----参数值n]);
    如果要接收返回值,可以这样调用
    返回值类型  变量名 = 函数名([参数值1,参数值2-----参数值n]
    

## 参数的类型

### (1)形式参数

        简称形参。形参出现在函数定义中,在整个函数体内都可以使用,离开该函数则不能使用。比如例3-10 中的int max (int a,int b) 中的 a,b 就是形式参数。

### (2)实际参数

        简称实参。实参可以是常量、变量或表达式。在函数调用时,实参出现在主调函数中,进入被调函数后,实参变量也不能使用。

        比如例10-3中的 int m=max(5,8); 此处的实参是5和8.形参和实参的功能是进行数据传送。发生函数调用时,主调函数把实参的值传送给被调函数的形参从而实现主调函数向被调函数的数据传送。

### 形参和实参具有以下三个特点

(1)形参变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。

(2)实参可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须具有确定的值,以便把这些值传给形参。

           因此应预先用赋值、输入等办法使实参获得确定值

(3)实参和形参在数量上、类型上、顺序上应严格一致,否则会发生“类型不匹配”的错误。

## 函数原型声明

作用:是把函数的返回值类型、函数的名字、形参的类型和数目通知编译系统,以便在调用该函数时系统按此进行对照检查(例如函数名是否正确,实参与形参的类型和个数是否一致)

## 函数返回值

        函数的返回值是指函数被调用之后,执行函数体中的程序段所取得的并返回给主调函数的值。

### 1、函数的值只能通过 return 语句返回主调函数。

    return 语句的一般形式为
    return 表达式;    或 return(表达式);

### 2、return 语句的功能

(1)计算表达式的值,并返回给主调函数

(2)跳出函数。在函数中尽管允许有多个 return 语句,但每次调用只会有一个 return 语句被执行,因此只能返回一个函数值

### 3、函数值的类型和函数定义中函数的类型应保持一致。如果两者不一致,则以函数类型为准,自动进行类型转换

### 4、不返回函数值的函数,可以明确定义为“空类型”,类型说明符为 "void"。

    void 函数名(形式参数列表)
    {
        函数体
    }

## 局部变量

1. 某个函数中定义的变量不能被另一个函数使用
  
2. 每次调用函数时局部变量都表示不同的储存空间
  

## 全局变量

        与局部变量的概念相对的时全局变量,全局变量定义在所有的函数体之外,它们在整个程序开始之前分配的存储空间,在程序结束时释放存储空间,所有函数都可以通过全局变量名访问它们。

## 结构(结构体)

什么是结构        struct:结构体

        “结构”是一种构造类型,它是由若干“成员”组成的。每个成员可以是一个基本数据类型或者又是一个构造类型。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值