设计好的商城网站建设网络公司,可信网站认证有用,游戏推广怎么快速拉人,株洲百度推广地址函数、指针 文章目录 函数、指针前言1 函数1.1 概述1.2 函数定义1.3 函数调用1.4 值传递1.5 函数常见样式1.6 函数声明1.7 函数分文件编写1.8 函数默认参数1.9 函数占位参数1.9 函数重载1.9.1 函数重载概述1.9.2 函数重载注意事项 2 指针2.1 指针基本概念2.2 指针变量定义和使用…函数、指针 文章目录 函数、指针前言1 函数1.1 概述1.2 函数定义1.3 函数调用1.4 值传递1.5 函数常见样式1.6 函数声明1.7 函数分文件编写1.8 函数默认参数1.9 函数占位参数1.9 函数重载1.9.1 函数重载概述1.9.2 函数重载注意事项 2 指针2.1 指针基本概念2.2 指针变量定义和使用2.3 指针所占内存空间2.4 空指针和野指针2.5 const 修饰指针2.6 指针和数组2.7 指针和函数2.8 指针、数组、函数 总结 前言
本文包含函数概述、函数定义、函数调用、值传递、函数常见样式、函数声明、函数份文件编写、函数默认参数、函数占位参数、函数重载、指针基本概念、指针变量定义和使用、指针所占内存空间、空指针和野指针、const修饰指针、指针和数组、指针和函数、指针数组函数。 1 函数
1.1 概述
作用 将一段经常使用的代码封装起来减少重复代码
一个较大的程序一般分为若干个程序块每个模块实现特定的功能
1.2 函数定义
函数的定义一般主要有5个步骤
1、返回值类型
2、函数名
3、参数表列
4、函数体语句
5、return 表达式
语法
返回值类型 函数名 参数列表
{函数体语句return表达式}1、返回值类型 一个函数可以返回一个值。在函数定义中
2、函数名给函数起个名称
3、参数列表使用该函数时传入的数据
4、函数体语句花括号内的代码函数内需要执行的语句
5、return 表达式 和返回值类型挂钩函数执行完后返回相应的数据
示例 定义一个加法函数实现两个数相加
// 返回值类型int
// 函数名add
// 参数列表(int num1, int num2)
// 函数体语句int sum num1 num2;
// return 表达式return sum;
int add(int num1, int num2)
{int sum num1 num2;return sum;
}1.3 函数调用
功能 使用定义好的函数
语法 函数名参数
#include iostream // 包含标准输入输出流文件
using namespace std; // 使用标准命名空间// 函数定义
int add(int num1, int num2) // 定义中的num1,num2称为形式参数简称形参
{int sum num1 num2;return sum;
}int main() {int a 10;int b 10;// 调用add函数int sum add(a, b); // 调用时的ab称为实际参数简称实参cout sum sum endl; // 20cout endl;system(pause); // 相当于在本地 Windows 调试器中的请按任意键继续...暂停方便看清楚输出结果return 0; // 程序正常退出
}1.4 值传递
1、所谓值传递就是函数调用时实参将数值传入给形参
2、值传递时如果形参发生并不会影响实参
#include iostream // 包含标准输入输出流文件
using namespace std; // 使用标准命名空间// 定义函数实现两个数字进行交换
void swap(int num1, int num2) // 如果函数不需要返回值声明的时候可以写void
{cout 交换前 endl;cout num1 num1 endl;cout num2 num2 endl;int temp num1;num1 num2;num2 temp;cout endl;cout 交换后 endl;cout num1 num1 endl;cout num2 num2 endl;//return ; // 当函数声明时候不需要返回值可以不写return
}int main() {int a 10;int b 20;cout mian中的 a a endl; // 10cout mian中的 b b endl; // 20swap(a, b); // 当我们做值传递的时候函数的形参发生改变并不会影响实参cout endl;cout mian中的 a a endl; // 10cout mian中的 b b endl; // 20cout endl;system(pause); // 相当于在本地 Windows 调试器中的请按任意键继续...暂停方便看清楚输出结果return 0; // 程序正常退出
}1.5 函数常见样式
常见的函数样式有4种
1、无参无返
2、有参无返
3、无参有返
4、有参有返
// 函数常见样式#include iostream // 包含标准输入输出流文件
using namespace std; // 使用标准命名空间// 1、无参无返
void test01()
{//void a 10; //无类型不可以创建变量,原因无法分配内存cout this is test01 endl;//test01(); 函数调用
}// 2、有参无返
void test02(int a)
{cout this is test02 endl;cout a a endl;
}// 3、无参有返
int test03()
{cout this is test03 endl;return 10;
}// 4、有参有返
int test04(int a, int b)
{cout this is test04 endl;int sum a b;return sum;
}int main() {test01();cout endl;test02(10);cout endl;cout test03() endl;cout endl;cout test04(20, 30) endl;cout endl;system(pause); // 相当于在本地 Windows 调试器中的请按任意键继续...暂停方便看清楚输出结果return 0; // 程序正常退出
}1.6 函数声明
作用 告诉编译器函数名称及如何调用函数。函数的实际主体可以单独定义
函数的声明可以多次但是函数的定义只能有一次
// 函数常见样式#include iostream // 包含标准输入输出流文件
using namespace std; // 使用标准命名空间// 声明
int max(int a, int b); // 提前告诉编译器函数的存在可以利用函数的声明声明后函数的定义可以写在main函数之后// 定义
int max(int a, int b)
{return a b ? a : b; // 比较函数实现两个整型数字进行比较返回较大的值
}int main() {int a 100;int b 200;cout max(a, b) endl; // 调用函数cout endl;system(pause); // 相当于在本地 Windows 调试器中的请按任意键继续...暂停方便看清楚输出结果return 0; // 程序正常退出
}1.7 函数分文件编写
作用 让代码结构更加清晰
函数分文件编写一般有4个步骤
1、创建后缀名为.h的头文件
2、创建后缀名为.cpp的源文件
3、在头文件中写函数的声明
4、在源文件中写函数的定义
swap.h
#include iostream // 包含输入输出流不写引用cout时会提示未定义
using namespace std; // 框架命名空间域// 实现两个数字交换的函数声明
void swap(int a, int b);swap.cpp
#include swap.h // 代表自定义的头文件void swap(int a, int b)
{int temp a;a b;b temp;cout a a endl;cout b b endl;
}main.cpp
#include iostream
using namespace std;#include swap.hint main() {int a 100;int b 200;swap(a, b);cout endl;system(pause);return 0;
}1.8 函数默认参数
在 C 中函数的形参列表中的形参是可以有默认值的
语法 返回值类型 函数名 参数 默认值{}
#include iostream // 包含标准输入输出流文件
using namespace std; // 使用标准命名空间// 如果我们自己传入数据就用自己的数据如果没有那么用默认值
// 语法返回值类型 函数名 (形参 默认值) {}
int func(int a, int b 10, int c 10) {return a b c;
}// 注意事项
// 1. 如果某个位置参数有默认值那么从这个位置往后从左向右必须都要有默认值
// 2. 如果函数声明有默认值函数实现的时候就不能有默认参数
int func2(int a 10, int b 10);
int func2(int a, int b) { // 二义性如果定义func2中给形参ab默认值调试程序时会报错声明和实现只能有一个默认参数return a b;
}int main() {cout ret func(20, 20) endl; // 50cout ret func(100) endl; // 120cout endl;system(pause); // 相当于在本地 Windows 调试器中的请按任意键继续...暂停方便看清楚输出结果return 0; // 程序正常退出
}1.9 函数占位参数
C 中函数的形参列表里可以有占位参数用来做占位调用函数时必须填补该位置
语法 返回值类型 函数名 (数据类型){}
#include iostream // 包含标准输入输出流文件
using namespace std; // 使用标准命名空间// 语法返回值类型 函数名 (数据类型) {}
// 函数占位参数 占位参数也可以有默认参数 {int a, int 10}
void func(int a, int) {cout this is func endl;
}int main() {func(10, 10); // 占位参数必须填补cout endl;system(pause); // 相当于在本地 Windows 调试器中的请按任意键继续...暂停方便看清楚输出结果return 0; // 程序正常退出
}1.9 函数重载
1.9.1 函数重载概述
作用 函数名可以相同提高复用性
函数重载满足条件
1、同一个作用域下
2、函数名称相同
3、函数参数类型不同 或者 个数不同 或者 顺序不同
注意 函数的返回值不可以作为函数重载的条件
// 函数重载可以让函数名相同提高复用性#include iostream // 包含标准输入输出流文件
using namespace std; // 使用标准命名空间// 函数重载的满足条件
// 1、函数重载需要函数都在同一个作用域下
// 2、函数名称相同
// 3、函数参数类型不同或者个数不同或者顺序不同
void func()
{cout func 的调用 endl;
}void func(int a)
{cout func (int a) 的调用 endl;
}void func(double a)
{cout func (double a)的调用 endl;
}void func(int a, double b)
{cout func (int a ,double b) 的调用 endl;
}void func(double a, int b)
{cout func (double a ,int b)的调用 endl;
}// 函数返回值不可以作为函数重载条件
//int func(double a, int b)
//{
// cout func (double a ,int b)的调用 endl;
//}int main() {func();func(10);func(3.14);func(10, 3.14);func(3.14, 10);cout endl;system(pause); // 相当于在本地 Windows 调试器中的请按任意键继续...暂停方便看清楚输出结果return 0; // 程序正常退出
}1.9.2 函数重载注意事项
1、引用作为重载条件
2、函数重载碰到函数默认参数
// 函数重载注意事项#include iostream // 包含标准输入输出流文件
using namespace std; // 使用标准命名空间// 1、引用作为重载条件
void func(int a)
{// int a 10不合法引用必须要有合法的内存空间堆区、栈区10在常量区cout func (int a) 调用 endl;
}void func(const int a) // 函数重载int和const int类型不同const int a 10合法const会做优化创建一个临时的数据a指向临时的内存空间
{cout func (const int a) 调用 endl;
}// 2、函数重载碰到函数默认参数
void func2(int a, int b 10)
{cout func2(int a, int b 10) 调用 endl;
}void func2(int a)
{cout func2(int a) 调用 endl;
}int main() {int a 10;func(a); // 调用无const(int a)a是变量可读可写const只可读func(10); // 调用有const(const int a) //func2(10); // 碰到默认参数产生歧义需要避免二义性cout endl;system(pause); // 相当于在本地 Windows 调试器中的请按任意键继续...暂停方便看清楚输出结果return 0; // 程序正常退出
}2 指针
2.1 指针基本概念
指针的作用 可以通过指针间接访问内存
1、内存编号是从0开始记录的一般用十六进制数字表示
2、可以利用指针变量保存地址
2.2 指针变量定义和使用
指针变量定义语法 数据类型 * 变量名
#include iostream // 包含标准输入输出流文件
using namespace std; // 使用标准命名空间int main() {// 1、指针的定义int a 10; // 定义整型变量a// 指针定义语法 数据类型 * 变量名 ;int* p;// 指针变量赋值p a; // 指针指向变量a的地址cout a endl; // 打印数据a的地址 00FFA5Ccout p endl; // 打印指针变量p 00FFA5C// 2、指针的使用// 通过*操作指针变量指向的内存cout *p *p endl; // 10 ; 通过解引用的方式来找到指针指向的内存中的数据cout endl;system(pause); // 相当于在本地 Windows 调试器中的请按任意键继续...暂停方便看清楚输出结果return 0; // 程序正常退出
}指针变量和普通变量的区别
1、普通变量存放的是数据指针变量存放的是地址
2指针变量可以通过 * 操作符操作指针变量指向的内存空间这个过程称为解引用
2.3 指针所占内存空间
提问 指针也是种数据类型那么这种数据类型占用多少内存空间
#include iostream // 包含标准输入输出流文件
using namespace std; // 使用标准命名空间int main() {int a 10;int* p a; // 指针指向数据a的地址cout *p endl; // * 解引用 10// 在32位操作系统下指针是占4个字节空间大小不管是什么数据类型// 在64位操作系统下指针是占8个字节空间打下cout sizeof(p) endl; // 8cout sizeof(char*) endl; // 8cout sizeof(float*) endl; // 8cout sizeof(double*) endl; // 8cout endl;system(pause); // 相当于在本地 Windows 调试器中的请按任意键继续...暂停方便看清楚输出结果return 0; // 程序正常退出
}2.4 空指针和野指针
空指针 指针变量指向内存中编号为0的空间
用途 初始化指针变量
注意 空指针指向的内存是不可以访问的
#include iostream // 包含标准输入输出流文件
using namespace std; // 使用标准命名空间int main() {// 指针变量p指向内存地址编号为0的空间int* p NULL;// 访问空指针报错 // 内存编号0 ~255为系统占用内存不允许用户访问cout *p endl;system(pause); // 相当于在本地 Windows 调试器中的请按任意键继续...暂停方便看清楚输出结果return 0; // 程序正常退出
}野指针 指针变量指向非法的内存空间
#include iostream // 包含标准输入输出流文件
using namespace std; // 使用标准命名空间int main() {// 指针变量p指向内存地址编号为0x1100的空间int* p (int*)0x1100; // 0x1100十六进制(int *)强转为指针类型没有权利操作编号为0x1100的内存空间// 访问野指针报错 cout *p endl; // 引发异常读取访问权限冲突system(pause); // 相当于在本地 Windows 调试器中的请按任意键继续...暂停方便看清楚输出结果return 0; // 程序正常退出
}2.5 const 修饰指针
const 修饰指针有三种情况
1、const 修饰指针 — 常量指针 2、const 修饰常量 — 指针常量
3、const 即修饰指针又修饰常量
#include iostream // 包含标准输入输出流文件
using namespace std; // 使用标准命名空间int main() {int a 10;int b 10;// 1、常量指针// const 修饰的是指针指针指向可以改指针指向的值不可以更改const int* p1 a;p1 b; // 正确// *p1 100; 报错// 2、指针常量// const 修饰的是常量指针指向不可以改指针指向的值可以更改int* const p2 a;//p2 b; // 错误*p2 100; // 正确// 3、const 既修饰指针又修饰常量const int* const p3 a;// p3 b; // 错误// *p3 100; // 错误system(pause); // 相当于在本地 Windows 调试器中的请按任意键继续...暂停方便看清楚输出结果return 0; // 程序正常退出
}2.6 指针和数组
作用 利用指针访问数组中元素
#include iostream // 包含标准输入输出流文件
using namespace std; // 使用标准命名空间int main() {int arr[] { 1,2,3,4,5,6,7,8,9,10 };int* p arr; // 指向数组的指针arr就是数组首地址cout 第一个元素 arr[0] endl; // 1cout 指针访问第一个元素 *p endl; // 1p; // 让指针向后偏移4/8个字节看不同操作系统cout 指针访问第二个元素 *p endl; // 2cout endl;p--;for (int i 0; i 10; i){//利用指针遍历数组cout *p endl;p;}cout endl;system(pause); // 相当于在本地 Windows 调试器中的请按任意键继续...暂停方便看清楚输出结果return 0; // 程序正常退出
}2.7 指针和函数
作用 利用指针作函数参数可以修改实参的值
#include iostream // 包含标准输入输出流文件
using namespace std; // 使用标准命名空间// 值传递
void swap1(int a, int b)
{int temp a;a b;b temp;
}// 地址传递
void swap2(int* p1, int* p2)
{int temp *p1;*p1 *p2;*p2 temp;
}int main() {int a 10;int b 20;swap1(a, b); // 值传递不会改变实参swap2(a, b); // 地址传递会改变实参cout a a endl; // 20cout b b endl; // 10cout endl;system(pause); // 相当于在本地 Windows 调试器中的请按任意键继续...暂停方便看清楚输出结果return 0; // 程序正常退出
}2.8 指针、数组、函数
案例描述 封装一个函数利用冒泡排序实现对整型数组的升序排序
例如数组int arr[10] { 4,3,6,9,1,2,10,8,7,5 };
#include iostream // 包含标准输入输出流文件
using namespace std; // 使用标准命名空间// 冒泡排序函数
void bubbleSort(int* arr, int len) // int * arr 也可以写为int arr[]数组首地址数组长度
{for (int i 0; i len - 1; i){for (int j 0; j len - 1 - i; j){if (arr[j] arr[j 1]){int temp arr[j];arr[j] arr[j 1];arr[j 1] temp;}}}
}// 打印数组函数
void printArray(int arr[], int len)
{for (int i 0; i len; i){cout arr[i] ;}cout endl;
}int main() {int arr[10] { 4,3,6,9,1,2,10,8,7,5 };int len sizeof(arr) / sizeof(int); // 数组长度bubbleSort(arr, len);printArray(arr, len); // 1,2,3,4,5,6,7,8,9,10cout endl;system(pause); // 相当于在本地 Windows 调试器中的请按任意键继续...暂停方便看清楚输出结果return 0; // 程序正常退出
}总结
1、函数定义里小括号内称为形参函数调用时传入的参数称为实参
2、值传递时形参是修饰不了实参的
3、我们可以通过 符号 获取变量的地址
4、利用指针可以记录地址
5、对指针变量解引用可以操作指针指向的内存
6、所有指针类型在32位操作系统下是4个字节
7、空指针和野指针都不是我们申请的空间因此不要访问
8、技巧看const右侧紧跟着的是指针还是常量是指针就是常量指针是常量就是指针常量
9、如果不想修改实参就用值传递如果想修改实参就用地址传递
10、当数组名传入到函数作为参数时被退化为指向首元素的指针。