c++基础知识——函数和指针

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


在这里插入图片描述

前言

前面学习了vector和数组,接下来将学习c++中的函数和指针的相关的知识.


一、 什么是函数?

简言之,函数就是一组相关语句组成的一个具有某种功能实现的整体.
函数分为库函数和用户自定义函数;
例如在math.h中,就有fabs,pow,ceil,floor等函数.
而有些时候我们需要多次用到一种运算关系时,就会自定义一个函数,然后进行调用.

二、函数的基本用法

在这里插入图片描述

C语言:
#define _CRT_SECURE_NO_WARNINGS 1//visual studio编译器才会用,方便输入;
#include<stdio.h>
int max(int a, int b)
{
	return a > b ? a : b;
}
int main(void)
{
	int a, b, c;
    scanf("%d%d", &a, &b);
	c = max(a, b);
	printf("%d", c);
}

c++代码:

#include<iostream>
using namespace std;
void max(int a, int b)
{
	if (a > b)
	{
		cout << a;
	}
	else if (a < b)
	{
		cout << b;
	}
	cout << endl;
}
int main(void)
{
	int a, b;
	cin >> a >> b;
	max(a, b);
}

函数中的递归和迭代

在数学中我们常常会遇到函数分类讨论,根据变量的取值来对应不同的函数表达式,那我们如何用代码去实现喃?就要用到今天讲的递归和迭代;
在这里插入图片描述
此时我们用递归就可以解决。
代码如下(示例):

递归方法:
#include<iostream>
using namespace std;
int f(int n)
{
	if (n <= 2)
	{
		return 1;
	}
	else
	{
		return f(n - 1) + f(n - 2);
	}
}
int main(void)
{
	int n;
	cin >> n;
	int sum = f(n);
	cout << sum << endl;
}
迭代:
#include<iostream>
using namespace std;
int f(int n)
{
	if (n <= 2)
	{
		return 1;
	}
	else
	{
		int fas1 = 1, fas2 = 1, ans;
		for (int i = 3; i <= n; i++)
		{
			ans = fas1 + fas2;
			fas1 = fas2;
			fas2 = ans;
		}
		return ans;
	}
}
int main(void)
{
	int n;
	cin >> n;
	int c = f(n);
	cout << c << endl;
}

变量的作用域与生命周期

在这里插入图片描述

编译预处理()

编译预处理主要包含宏定义,文件包含和条件编译,以#开始,不需要分号结束;

宏定义

利用关键字define,定义一个宏,可以是变量,也可以是参数;
在这里插入图片描述

文件包含

文件包含是指将一些头文件或其他源文件包含到本文件中,一个文件被包含后,该文件的所有内容就被包含进来了,
#include<文件名>
#include"文件名"
尖括号和双引号的区别:
用尖括号时,称为标准模式,系统直接到存放c/c++库函数的文件中查找要包含的文件。用双引号的时候,系统优先在当前目录中查找要包含的头文件,若找不到,再按标准模式查找。一般来说使用库函数的时候用尖括号,使用用户自定义的头文件时,用双引号;

条件编译

条件编译是以带#的if语句(有#if,$ifdef,#ifndef,#elif等多种形式)以#endif结束。

结构体

结构体类型声明

结构体类型的声明需要用关键字struct开头,格式如下:
在这里插入图片描述

结构体变量的定义及初始化

1.变量的定义
在这里插入图片描述
也可以用关键字typedef类型定义类型别名;
只有定义了变量后才会分配空间;
2.变量的初始化;
在这里插入图片描述

结构体变量的使用

#include<iostream>
using namespace std;
struct Student
{
	char name[20];//姓名
	double score;//成绩
	char sex[10];//性别;
};
int main(void)
{
	int n;
	Student *s=(Student*)malloc(sizeof(Student));//申请动态存储空间;
	cin >> n;
	for (int i = 0; i < n; i++)
	{
		cin >> s[i].name >> s[i].score >> s[i].sex;
	}
	cout << "学生的姓名" << "     " << "学生的成绩" << "     " << "学生的性别" << endl;
	for (int i = 0; i < n; i++)
	{
		cout << s[i].name << "     " << s[i].score << "     " << s->sex << endl;
	}
}

在这里插入图片描述

指针

初识指针变量

指针变量是专门用来存放另一个变量的地址的变量,指针变量的值是指针中存放的变量的值。
在这里插入图片描述

指针变量与一维数组

在这里插入图片描述
二维指针数组也和一维数组相似,就不过多介绍.

动态堆内存分配

前面我们介绍了vector,今天我们也可以用动态堆区内存申请以达到和vector相同的作用.
题目要求:首先输入一个n的值,然后输入n个学生的成绩,求出高于平均成绩的学生的人数。
解题思路:因为我们不知道n的值,故不能直接定义叔祖的长度,这个时候就可以用vector(向量)或者动态空间内存分配;注意内存空间分配完后,需要删除动态空间的内存;
2.读入数据
代码如下(示例):

#include<iostream>
using namespace std;
int solve(int a[], int n)
{
	int sum = 0, cnt = 0;
	for (int i = 0; i < n; i++)
	{
		sum += a[i];
	}
	for (int i = 0; i < n; i++)
	{
		if (a[i] > 1.0 * (sum) / n)
		{
			cnt++;
		}
	}
	return cnt;
}
int main(void)
{
	int n;
	cin >> n;
	int* a = new int[n];//动态空间申请;
	for (int i = 0; i < n; i++)
	{
		cin >> a[i];
	}
	int c = solve(a, n);
	cout << c << endl;
	delete [] a;
}

指针与函数

指针变量可以作为函数参数,当指针变量为形参的时候,通过改变形参的间接引用来改变实参的值.
l例如:
void f(int a[ ],int n)
{
函数体;
}
等价于
void f(int*a,int n)
{
函数体;
}

#include<iostream>
using namespace std;
int swa(int* a, int* b)
{
	return *a > *b ? *a : *b;
}
int main(void)
{
	int a, b;
	int c;
	cin >> a >> b;
	c=swa(&a, &b);
	cout << c << endl;
}

总结

本节介绍了指针和函数,指针无论在c语言中还是c++中都是一种重要的知识点,需要花大量时间去实际操作,下一期更新数据结构STL中的list(链表);

  • 21
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 29
    评论
评论 29
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

心随而动

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值