面向过程编程自学笔记整理
四、函数
1、函数
#include"iostream"
using namespace std;
//函数的作用:
//将一段经常使用的代码封装起来,减少重复代码
/***********************1.函数定义五个步骤***********************/
/*
1.返回值类型
2.函数名
3.参数列表
4.函数体语句
5.return表达式
返回值类型 函数名(参数列表)
{
函数体语句;
return表达式;
}
*/
/***************2.写一个加法函数传入两个整形数据,相加返回结果*************************/
/*
1.返回值类型 int
2.函数名 add
3.参数列表 (int num1,int num2)
4.函数体语句 int sum=num1+num2;
5.return表达式 return sum;
*/
//int add(int num1, int num2)//加法函数的定义
//{
// //函数定义时,num1和num2无真实的数据,为形式参数,简称形参
// int sum = num1 + num2;
// return sum;
//}
/******************3.函数的调用*************************************************/
//函数名(参数)
//int main()
//{
// //mian函数中调用add函数
// int a1 = 10;
// int b1 = 20;
// //函数调用语法:函数名称(参数)
// //a1和b1称为实际参数,简称实参
// int c1=add(a1, b1);
// cout << "c1=" << c1 << endl;
// int a2 = 38;
// int b2 = 34;
// int c2 = add(a2, b2);
// cout << "c2=" << c2 << endl;
// system("pause");
// return 0;
//}
/******************4.值的传递*************************************************/
//定义函数:实现两个数字进行交换的函数
//如果函数不需要返回值,声明的时候可以写void
//void swap(int num1, int num2)
//{
// cout << "交换前" << endl;
// cout << "num1=" << num1 << endl;
// cout << "num2=" << num2 << endl;
//
// int temp = num1;
// num1 = num2;
// num2 = temp;
//
// cout << "交换后" << endl;
// cout << "num1=" << num1 << endl;
// cout << "num2=" << num2 << endl;
// //return;不需要返回值的时候,可以不写return
//}
//
//int main()
//{
// int a = 10;
// int b = 88;
// cout << "a=" << a << endl;
// cout << "b=" << b << endl;
// swap(a, b);
注意事项:做值传递时,函数的形参发生变化,并不会影响实参
// cout << "a=" << a << endl;
// cout << "b=" << b << endl;
//
// system("pause");
// return 0;
//}
/*****************5.函数的常见样式*************************************************/
1.无参无返
//void test01()
//{
// cout << "this is test 01" << endl;
//}
2.有参无返
//void test02(int a)
//{
// cout << "this is test 02,a=" <<a<< endl;
//}
3.无参有返
//int test03()
//{
// cout << "this is test 03" << endl;
// return 100;
//}
//
4.有参有返
//int test04(int a)
//{
// cout << "this is test 04,"<<endl;
// return a;
//}
//int main()
//{
// //无参无返函数调用
// test01();
// //有参无返函数调用
// test02(10);
// //无参有返函数调用
// int num1=test03();
// cout << "num1="<<num1 << endl;
// //有参有返函数调用
// int num2 = test04(200);
// cout << "num2=" << num2 << endl;
// system("pause");
// return 0;
//}
/*****************6.函数的声明*************************************************/
//函数声明的作用:告诉编译器函数的名称以及如何让调用函数,函数的实际主体可以单独定义
//注意事项:函数的声明可以多次,但函数的定义只能有一次
//比较函数:实现两个整形数字进行对比,返回较大的值
//提前告诉编译器函数的存在,可以利用函数的声明
int max(int a, int b);//函数声明
//函数声明可以写多次,但是定义只能写一次
int max(int a, int b)//函数定义
{
return a > b ? a : b;//三目运算符
}
int main()
{
int a = 20;
int b = 39;
cout << max(a, b) << endl;
system("pause");
return 0;
}
2、函数分文件编写
函数分文件编写.cpp
#include"iostream"
using namespace std;
#include"swap.h"
//函数的分文件编写
//作用:让代码结构清晰
//函数分文件编写4步骤
/*
1.创建后缀名为.h的头文件
2.创建后缀名为.cpp的源文件
3.在头文件中写函数的声明
4.在源文件中写函数的定义
*/
//实现两个数字进行交换的函数
函数的声明
//void swap(int a, int b);
//函数的定义
//void swap(int a, int b)
//{
// int temp = a;
// a = b;
// b = temp;
//
// cout << "a=" << a << endl;
// cout << "b=" << b << endl;
//
//}
int main()
{
int a = 28;
int b = 66;
swap(28, 66);
system("pause");
return 0;
}
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;
}
swap.h
#include"iostream"
using namespace std;
//实现两个数字进行交换的函数
void swap(int a, int b);//函数的声明
五、指针
#include"iostream"
using namespace std;
//int main()
//{
/****************1.指针的基本概念和定义*********************************/
//指针:用来保存一个地址(指针就是地址)
1.定义指针
//int a = 10;
指针定义语法:数据类型*指针变量名;
//int * p;
让指针记录变量a的地址
//p = &a;//建立二者的关系
//cout << "a的地址为:" << &a << endl;
//cout << "指针p为:" << p << endl;
2.使用指针
可以通过解引用的方式找到指针指向的内存
// //指针前加一个*叫解引用,找到指针指向的内存中的数据
//*p = 1000;//解引用,可以通过指针读取和修改对应内存数据
//cout << "a=" << a << endl;
//cout << "*p=" << *p << endl;
/****************2.指针所占内存空间*********************************/
//指针也是数据类型,指针的所占的内存空间多大?
指针所占内存空间
//int a = 10;
int* p;
p = &a;
//int* p = &a;
在x86(32位)操作系统下,指针占4个字节空间大小,不管什么数据类型
在x64(64位)操作系统下,指针占8个字节空间大小,不管什么数据类型
//cout << "sizeof (int*)=" << sizeof(int*) << endl;
//cout << "sizeof (p)=" << sizeof(p) << endl;//int*和p等价
//cout << "sizeof (float*)=" << sizeof(float*) << endl;
//cout << "sizeof (double*)=" << sizeof(double*) << endl;
//cout << "sizeof (char*)=" << sizeof(char*) << endl;
//cout << "sizeof (long*)=" << sizeof(long*) << endl;
//cout << "sizeof (long long*)=" << sizeof(long long*) << endl;
/****************3.空指针*********************************/
//空指针:指针变量指向内存中编号为0的空间
//用途:初始化指针变量
//int* p = NULL;
注意事项:空指针指向的内存空间是不可访问的
0~255之间的内存编号是系统占用的,因此不可以访问
//*p = 100;//程序直接报错,奔溃
/****************4.野指针*********************************/
//在程序中,必须避免出现野指针
//int* p =(int *)0x11100;//随便指向一个未知的内存空间的指针为野指针
//cout << *p << endl;//会报错,显示没有访问权限
//结论:空指针和野指针都不是我们所申请的空间,所以不要访问
/****************5.const修饰指针*********************************/
//const修饰指针三种情况(前向后值)
//const翻译为常量
//*为指针
//1.const修饰指针——常量指针
//指针指向可以改,指针指向的值不可以改
//int a = 10;
//int b = 20;
//const int* p = &a;(常量和指针=常量指针)
//*p = 30;//报错,显示指针指向值不可修改
//p = &b;//显示不会报错
//2.const修饰常量——指针常量
//指针指向不可以改,指针指向的值可以改
//int a = 10;
//int b = 20;
//int* const p = &a;(指针和常量=指针常量)
//*p = 40;//显示不会报错
//p = &b;//报错,显示指针的指向不可修改
//3.const既修饰指针,又修饰常量
//指针指向和指向的值都不可以修改
//int a = 10;
//int b = 20;
//const int* const p = &a;
//*p = 20;//报错,显示指针指向值不可修改
//p = &b;//报错,显示指针的指向不可修改
/****************6.数组和指针*********************************/
//利用指针访问数组中的元素
// int arr[10] = {1,2,3,4,5,6,7,8,9,10};
// cout << "数组中的第一个元素为:" << arr[0] << endl;
//
// int* p = arr;//arr就是数组的首地址
// cout << "利用指针访问数组第一个元素:" << *p << endl;
//
// p++;//让指针向后偏移8个字节(x64)/4个字节(x86)
// cout << "利用指针访问第二个元素:" << *p<<endl;
//
// cout << "利用指针遍历数组中的元素" <<endl;
// int* p2 = arr;
// for (int i = 0; i < 10; i++)
// {
// //cout << arr[i] << endl;
// cout << *p2 << endl;
// p2++;
// }
// system("pause");
// return 0;
//}
/****************7.指针和函数*********************************/
//利用指针做函数的参数,修改实参的值
//实现两个数字进行交换
//void swap01(int a, int b)//传入的为两个参数
//{
// int temp = a;
// a = b;
// b = temp;
// cout << "swap01 a=" << a << endl;
// cout << "swap01 b=" << b << endl;
//}
//
//void swap02(int *p1,int *p2)//传入的为两个指针
//{
// int temp = *p1;
// *p1 = *p2;
// *p2 = temp;
//}
//
//int main()
//{
// //指针和函数
// int a = 10;
// int b = 20;
// //1.值传递
// // 如果是值传递,只能修改形参,不能修改实参
// //swap01(a, b);
// //2.地址传递
// //如果是地址传递,可以修改实参
// swap02(&a, &b);
// cout << "a=" << a << endl;
// cout << "b=" << b << endl;
// system("pause");
// return 0;
//}
/****************8.指针,数组,函数典型案例*********************************/
//案例:封装一个函数,利用冒泡排序,对整形数组实现升序排列
//冒泡排序函数:参数1—数组首地址,参数2—数组长度
void bubblesort(int *arr,int len)
{
for (int i = 0; i < len - 1; i++)
{
for (int j = 0; j < len - i - 1; j++)
{
//如果j>j+1,交换这两个数
if (arr[j] > arr[j + 1])
{
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
//打印数组的函数
void printarr(int* arr, int len)
{
for (int i = 0; i < len; i++)
{
cout << arr[i] << " ";
}
cout << endl;
}
int main()
{
//1.创建一个数组
int arr[10]={4,3,6,9,1,2,10,8,7,5};
//数组长度
int len = sizeof(arr) / sizeof(arr[0]);
//2.创建一个函数,实现冒泡排序
bubblesort(arr,len);
//打印排列后的数组
printarr(arr, len);
system("pause");
return 0;
}