一、函数
1.1 函数概述
作用:提高代码的编写效率,实现对代码的重用
函数使用步骤
定义函数
理解为制作工具,工具只需要制作1次即可
调用函数
理解为使用工具
1.2 无参无返回值
1.3 有参无返回值(重点)
函数参数的作用:增加函数的灵活性
可以根据需求在调用函数时, 通过参数传入不同的数据
1.4 有参有返回值
1.4.1 返回值基本语法(重点)
-
函数返回值的作用:函数外部想使用函数内部的数据
1.4.2 返回值注意点
return的作用是结束函数
函数内,return后面的代码不会执行
1.5 函数的声明
如果函数定义代码没有放在函数调用的前面,这时候需要先做函数的声明
所谓函数声明,相当于告诉编译器,函数是有定义的,再别的地方定义,以便使编译能正常进行
注意:一个函数只能被定义一次,但可以声明多次
1.6 函数案例
需求:自定义一个函数,返回2个整数的最大值
1.7 局部和全局变量
1.7.1 局部变量
定义在函数内部的变量称为局部变量(Local Variable)
局部变量的作用域(作用范围)仅限于函数内部, 离开该函数后是无效的
离开该函数后,局部变量自动释放
1.7.2 全局变量
-
在所有函数外部定义的变量称为全局变量(Global Variable),它的作用域默认是整个程序,也就是所有的源文件
1.8 多文件编程(重点)
把函数声明放在头文件xxx.h中,在主函数中包含相应头文件
在头文件对应的xxx.c中实现xxx.h声明的函数
防止头文件重复包含:
当一个项目比较大时,往往都是分文件,这时候有可能不小心把同一个头文件 include 多次,或者头文件嵌套包含。
为了避免同一个文件被include多次,C/C++中有两种方式。
-
方法一:
#ifndef __SOMEFILE_H__
#define __SOMEFILE_H__
// 声明语句
#endif
-
方法二(嵌入式不能用):
#pragma once // 声明语句
头文件包含的区别:
<> 表示系统直接按系统指定的目录检索
"" 表示系统先在 "" 指定的路径(没写路径代表当前路径)查找头文件,如果找不到,再按系统指定的目录检索
多文件编程运行结果出现中文乱码:在命令行输入:
chcp 65001
再编译执行。
二、指针
2.1 基本语法
2.1.1 指针变量的定义和使用(重点)
指针也是一种数据类型,指针变量也是一种变量
指针变量指向谁,就把谁的地址赋值给指针变量
2.1.2 通过指针间接修改变量的值
指针变量指向谁,就把谁的地址赋值给指针变量
通过 *指针变量 间接修改变量的值
2.1.3 const修饰的指针变量
-
语法格式
int a = 1; const int *p1 = &a; // 等价于 int const *p1 = &a; int * const p2 = &a; const int * const p3 = &a;
从左往右看,跳过类型,看修饰哪个字符
-
如果是*, 说明指针指向的内存不能改变
-
如果是指针变量,说明指针的指向不能改变,指针的值不能修改
2.1.4 指针大小
使用sizeof()测量指针的大小,得到的总是:4或8
sizeof()测的是指针变量指向存储地址的大小
在32位平台,所有的指针(地址)都是32位(4字节)
在64位平台,所有的指针(地址)都是64位(8字节)
2.1.5 指针步长
指针步长指的是通过指针进行递增或递减操作时,指针所指向的内存地址相对于当前地址的偏移量。
指针的步长取决于所指向的数据类型。
指针加n等于指针地址加上 n 个 sizeof(type) 的长度
指针减n等于指针地址减去 n 个 sizeof(type) 的长度
2.1.6 野指针和空指针
指针变量也是变量,是变量就可以任意赋值
任意数值赋值给指针变量没有意义,因为这样的指针就成了野指针
此指针指向的区域是未知(操作系统不允许操作此指针指向的内存区域)
野指针不会直接引发错误,操作野指针指向的内存区域才会出问题
为了标志某个指针变量没有任何指向,可赋值为NULL
NULL是一个值为0的宏常量
2.1.7 多级指针
-
C语言允许有多级指针存在,在实际的程序中一级指针最常用,其次是二级指针。
2.2 指针和函数
2.2.1 函数参数传值
-
传值是指将参数的值拷贝一份传递给函数,函数内部对该参数的修改不会影响到原来的变量
2.2.2 函数参数传址(重点)
-
传址是指将参数的地址传递给函数,函数内部可以通过该地址来访问原变量,并对其进行修改。
总结:
/**
* 函数概念:把具有某些功能的代码 封装到一起
* 函数作用:提高带的复用率
* 函数的类型:无参无返回值 有参无返回值 有参 有返回值的
* 函数的返回类型: void int …… ---->return 数据类型 就是你的函数的返回类型
* 局部变量和全局变量
* 局部变量:定义在{}中的变量 生效的范围 也是在{}中 生命周期:{}代码执行完 变量就销毁了
* 全局变量:定义在函数外部的变量 生效的范围 是整个文件 生命周期 :程序执行完成
* 指针:是一种数据类型 int *p int 类型的指针 p是指针变量名称 指针指向的是地址空间
* int a = 10; int *p = &a;
* 输出指针的值 *p 输出地址是 p
* 通过指针修改变量的值
* int a = 10; int *p = &a; *p = 23;
* const 修饰谁 谁就不能修改 (跳过类型) const int *p *p 不能修改 p可以修改
* 指针的大小:
* 看平台 32还是64 32 4字节 64 8字节 指针大小通过sizeof 查看
* 步长:
* 步长是指针增加或者减少1个单位的偏移量 步长和类型有关系 char 步长 1字节 int 步长 4字节
* 野指针:给指针赋值一个未知地址空间 不能修改空间地址的值 编译会报错
* 空指针:定义一个未指向任何地址的指针 可以使用NULL初始化 空指针 #define NULL 0
* 多级指针:例如:二级指针可以存储一级指针变量的地址 三级指针,可以存储二级指针变量的地址
*
*/