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

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

前言


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


一、 什么是函数?


简言之,函数就是一组相关语句组成的一个具有某种功能实现的整体.

函数分为库函数和用户自定义函数;

例如在math.h中,就有fabs,pow,ceil,floor等函数.

而有些时候我们需要多次用到一种运算关系时,就会自定义一个函数,然后进行调用.


二、函数的基本用法


eae4ccb1cb95df09924e182ff707b366_790c51e035734c6987fc3c0c49046fc5.png


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);
}



函数中的递归和迭代


在数学中我们常常会遇到函数分类讨论,根据变量的取值来对应不同的函数表达式,那我们如何用代码去实现喃?就要用到今天讲的递归和迭代;


0d2593e43feb997553a8ee01d9db1463_26ff46da09de47c2a581f7cd9c656ef4.png


此时我们用递归就可以解决。

代码如下(示例):


递归方法:
#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;
}



变量的作用域与生命周期


8dbb5c7acb3c5767bf5edbdf5d6eb209_bfaa99f811564eb2b62f33eb2cb7e7eb.png


编译预处理()


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


宏定义


利用关键字define,定义一个宏,可以是变量,也可以是参数;


c9cd2b04dbc5eaf0107dd9dcf0c1ae04_3b3a84c4291f4ebd9d72062c56d0c8a1.png


文件包含


文件包含是指将一些头文件或其他源文件包含到本文件中,一个文件被包含后,该文件的所有内容就被包含进来了,

#include<文件名>

#include"文件名"

尖括号和双引号的区别:

用尖括号时,称为标准模式,系统直接到存放c/c++库函数的文件中查找要包含的文件。用双引号的时候,系统优先在当前目录中查找要包含的头文件,若找不到,再按标准模式查找。一般来说使用库函数的时候用尖括号,使用用户自定义的头文件时,用双引号;


条件编译


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


结构体


结构体类型声明

结构体类型的声明需要用关键字struct开头,格式如下:


ea20699e61d818d53088baea0564c4a5_abcd99f206d34066a291e5a5c79e9302.png


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


1.变量的定义


bd27086fd0543c1ba6215144659eb0c9_d1fad6e0de794f88a8567c2a14901848.png


也可以用关键字typedef类型定义类型别名;

只有定义了变量后才会分配空间;

2.变量的初始化;


680b07a9ed35924b0871144467ffd6b5_8fb7dfce91fb48f383d3cbf93e1bf275.png


结构体变量的使用


#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;
  }
}


f0fe637423103730290bf5c04f449724_33259e7715f545d9a25862d1915de8b8.png



指针


初识指针变量


指针变量是专门用来存放另一个变量的地址的变量,指针变量的值是指针中存放的变量的值。


ea338efd15e15870b7375ff6da16f373_afda40e55abc49d38c08857532310810.png


指针变量与一维数组


ffcaf6fb85251b5df0a081b7966268e8_9046bc2da2e24bada7e2d5376c73efa0.png


二维指针数组也和一维数组相似,就不过多介绍.


动态堆内存分配


前面我们介绍了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(链表);

相关文章
|
25天前
|
存储 程序员 C++
深入解析C++中的函数指针与`typedef`的妙用
本文深入解析了C++中的函数指针及其与`typedef`的结合使用。通过图示和代码示例,详细介绍了函数指针的基本概念、声明和使用方法,并展示了如何利用`typedef`简化复杂的函数指针声明,提升代码的可读性和可维护性。
65 0
|
2月前
|
存储 人工智能 算法
数据结构实验之C 语言的函数数组指针结构体知识
本实验旨在复习C语言中的函数、数组、指针、结构体与共用体等核心概念,并通过具体编程任务加深理解。任务包括输出100以内所有素数、逆序排列一维数组、查找二维数组中的鞍点、利用指针输出二维数组元素,以及使用结构体和共用体处理教师与学生信息。每个任务不仅强化了基本语法的应用,还涉及到了算法逻辑的设计与优化。实验结果显示,学生能够有效掌握并运用这些知识完成指定任务。
63 4
|
2月前
|
存储 编译器 Linux
【c++】类和对象(上)(类的定义格式、访问限定符、类域、类的实例化、对象的内存大小、this指针)
本文介绍了C++中的类和对象,包括类的概念、定义格式、访问限定符、类域、对象的创建及内存大小、以及this指针。通过示例代码详细解释了类的定义、成员函数和成员变量的作用,以及如何使用访问限定符控制成员的访问权限。此外,还讨论了对象的内存分配规则和this指针的使用场景,帮助读者深入理解面向对象编程的核心概念。
172 4
|
3月前
|
存储 C语言 C++
如何通过指针作为函数参数来实现函数的返回多个值
在C语言中,可以通过将指针作为函数参数来实现函数返回多个值。调用函数时,传递变量的地址,函数内部通过修改指针所指向的内存来改变原变量的值,从而实现多值返回。
|
3月前
|
存储 安全 编译器
在 C++中,引用和指针的区别
在C++中,引用和指针都是用于间接访问对象的工具,但它们有显著区别。引用是对象的别名,必须在定义时初始化且不可重新绑定;指针是一个变量,可以指向不同对象,也可为空。引用更安全,指针更灵活。
|
3月前
|
存储 搜索推荐 C语言
如何理解指针作为函数参数的输入和输出特性
指针作为函数参数时,可以实现输入和输出的双重功能。通过指针传递变量的地址,函数可以修改外部变量的值,实现输出;同时,指针本身也可以作为输入,传递初始值或状态。这种方式提高了函数的灵活性和效率。
|
3月前
|
程序员 C++ 容器
在 C++中,realloc 函数返回 NULL 时,需要手动释放原来的内存吗?
在 C++ 中,当 realloc 函数返回 NULL 时,表示内存重新分配失败,但原内存块仍然有效,因此需要手动释放原来的内存,以避免内存泄漏。
|
3月前
|
存储 前端开发 C++
C++ 多线程之带返回值的线程处理函数
这篇文章介绍了在C++中使用`async`函数、`packaged_task`和`promise`三种方法来创建带返回值的线程处理函数。
115 6
|
3月前
|
C++
C++ 多线程之线程管理函数
这篇文章介绍了C++中多线程编程的几个关键函数,包括获取线程ID的`get_id()`,延时函数`sleep_for()`,线程让步函数`yield()`,以及阻塞线程直到指定时间的`sleep_until()`。
52 0
|
3月前
利用指针函数
【10月更文挑战第2天】利用指针函数。
25 1