《算法笔记知识点记录》第二章——快速入门3[函数、指针](1)

简介: 《算法笔记知识点记录》第二章——快速入门3[函数、指针](1)

☘前言☘

今天是我开坑的第三天,大家最近应该都在忙期末把?答应我考完试来打卡好么0.0

今天依然是会介绍很多基础知识,但是会很实用,如果我有哪些没有讲清楚的,欢迎大家联系我,你提出的问题是我修改完善的基础,万分感谢。


欢迎大家加入我的打卡队列,如果你刷完了对你有帮助请你评论一个打卡。

如果你觉得这本书有用的话还希望多多支持作者。

如果觉得这个文章有用还希望大家交出素质三连呀。


🧑🏻作者简介:一个从工业设计改行学嵌入式的年轻人

✨联系方式:2201891280(QQ)

📔源码地址:https://gitee.com/xingleigao/algorithm-notes

⏳全文大约阅读时间: 80min


文章目录

 ☘前言☘

 🍭1. 基础知识点

            🐌1.1 函数

                     🐰1.1.1 函数的定义

                     🐮1.1.2 main函数

                     🐟1.1.3 数组作为函数传参

                     🐬1.1.4 函数的递归调用

            ⚔️1.2 指针

                      🗡1.2.1 指针究竟是什么

                      🛡1.2.2 指针变量

                      🔧1.2.3 指针与数组

                       ⚒1.2.4 使用指针变量作为函数参数

                      🔨1.2.6 引用

 🐳课后习题

🍭1. 基础知识点

有了上节课的一点点开头印象,我们这次就可以看看稍微更加难以理解的东东,这部分也是c语言经久不衰的灵魂——指针和函数。

那我们废话不多说,开始今天的学习吧。


🐌1.1 函数

如果程序逻辑比较复杂,代码量比较大、或者是重复性功能比较多,那么全写在main函数就会显得十分杂乱。为了使代码更简洁、思路更加清晰,C语言提供了函数功能。函数是一个实现一定功能的语句集合,并在需要时可以反复调用而不必每次重新写一遍。

其中我们用到的sin()和cos()都是已经定义好的函数方便我们调用。


🐰1.1.1 函数的定义

如果我们函数体内有大量的重复操作,我们就可以自己定义一个函数。

基本定义的方法为:


返回类型 函数名称(参数类型 参数){
  函数主体
}


举个例子


#include<cstdio>
void print1(){
  printf("Haha,\n");
  printf("Good idea!\n");
}
int main(){
  print1();
  return 0;
}


执行结果就是


Haha,
Good idea!


我们看这个函数的类型,是void,所谓的void就是空,即不返回任何结果。

然后是我们调用的时候,由于不需要传参 所以括号里就是空的啥也没有,这种叫做无参函数。


再看一个例子


#include<cstdio>
int judge(int x);
int main(){
  int a, ans;
  scanf("%d",&a);
  ans = judge(a);
  printf("%d\n",ans);
  return 0;
}
int judege(int x){
  if(x > 0) return 1;
  else if(x == 0) return 0;
  else return -1;
}


输入-4执行结果就是:

-1


上面的代码就是将a传给x然后返回对应的值。

需要注意的点是

我这里故意把函数在后面定义了,如果不加第二行的那个声明编译器就会报错。所以如果你想写一个函数做占位符就要在最上面加声明。

如果你细心的话,会发现a传入怎么就变成了x了呢?

我们来看两个概念,就是全局变量和局部变量。


全局变量

全局变量就是定义之后所有程序段内都有效的变量。(可以理解为所有模块都能用)

举个例子


#include<cstdio>
int x;
void chage(){
  x = x + 1;
}
int main(){
  x = 10;
  change();
  printf("%d\n",x);
  return 0;
}


输出结果11

因为x是定义在最前面,每个函数都能找到这个变量的位置。所以就可以对它进行修改。


局部变量

相对的有一个概念就是局部变量,就是只有在函数体内部生效的变量。(可以理解为只在一小段程序内有效)

其实我们之前就接触到这个局部变量。for循环中的第一个初始化的时候如果声明变量,在for循环结束就会销毁。这是不是就是局部变量?

看个例子:


#include<cstdio>
void change(int x){
  x = x + 1;
}
int main(){
  int x = 10;
  change(x);
  printf("%d\n",x);
  return 0;
}


执行的结果就是10

为啥是10 内,其实因为change内的x和main函数的x并不是同一个x,change内的x只是main函数内x的一个副本。


( 这句话你们可以以后再看)每个函数都有自己的调用栈,当调用一个函数的时候,会创建自己的内存空间,让后把对应的传入参数复制到自己的栈内存区。


如果希望传入的值发生改变应该怎么整呢?其实主要问题就是要让在一个新函数内找到原来的变量的位置。所以要传入一个地址。(超纲了。。。下面讲)

最后,传入参数可以有多个,如下面的例子。


#include<cstdio>
int MAX(int a, int b, int c){
  int M;
  if(a >= b && a >= c)  M = a;
  else if(b >= a && b >= c) M = b;
  else M = c;
  return M;
}
int main(){
  int a, b, c;
  scanf("%d%d%d",&a, &b, &c);
  printf("%d\n",MAX(a, b, c);
  return 0;
}


上面的程序就是打印三个值中最大的那个!


🐮1.1.2 main函数

我们一直在用main函数还没好好看看它233

无论一个程序多么复杂,程序执行都是先找名字叫做main的函数进行执行。

基本结果就是


int main(){
  return 0;
}


其中的return 0就代表程序正常结束了。虽然现在main可以void。但是我不太建议,因为以后程序可能有一些问题返回不同的错误码非常有必要。


🐟1.1.3 数组作为函数传参

函数也是可以作为参数传入的。但是不需要写第一维的长度(本质还是传入了一个指针0.0)。

重要的是,数组作为传参时,在函数中对数组元素的修改就等于对原数组元素的修改。(毕竟指针都过来了,读到的元素也是之前的元素-.-)

示例:


#include<cstdio>
void change(int a[], int b[][5]){
  a[0] = 1;
  a[1] = 3;
  a[2] = 5;
  b[0][0] = 1;
}
int main(){
  int a[3] = {0};
  int b[5][5] = {0};
  change(a,b);
  for(int i = 0;i < 3; i++)
  printf("%d ",a[i]);
  return 0;
}


上面的输出结果就是1 3 5,因为对数组的修改就是直接修改。(先记住吧。下面就会讲到,就是直接操作的原本元素)


🐬1.1.4 函数的递归调用

递归就是函数自己调用自己的过程。

#include<cstdio>
int F(int n){
  if(n == 0)  return 1;
  else return F(n-1) * n;
}
int main(){
  int n;
  scanf("%d",&n);
  printf("%d\n",F(n));
  return 0;
}


输入数据:3 输出结果:6

我自信看完指针,这块你会有更深的理解0.0,先记住,等下解密。

相关文章
|
2月前
|
算法 机器人 定位技术
【VRPTW】基于matlab秃鹰算法BES求解带时间窗的骑手外卖配送路径规划问题(目标函数:最优路径成本 含服务客户数量 服务时间 载量 路径长度)(Matlab代码实现)
【VRPTW】基于matlab秃鹰算法BES求解带时间窗的骑手外卖配送路径规划问题(目标函数:最优路径成本 含服务客户数量 服务时间 载量 路径长度)(Matlab代码实现)
|
25天前
|
机器学习/深度学习 传感器 算法
基于matlab瞬态三角哈里斯鹰算法TTHHO多无人机协同集群避障路径规划(目标函数:最低成本:路径、高度、威胁、转角)(Matlab代码实现)
基于matlab瞬态三角哈里斯鹰算法TTHHO多无人机协同集群避障路径规划(目标函数:最低成本:路径、高度、威胁、转角)(Matlab代码实现)
|
2月前
|
机器学习/深度学习 算法 数据挖掘
【配送路径规划】基于螳螂虾算法MShOA求解带时间窗的骑手外卖配送路径规划问题(目标函数:最优路径成本 含服务客户数量 服务时间 载量 路径长度)研究(Matlab代码实现)
【配送路径规划】基于螳螂虾算法MShOA求解带时间窗的骑手外卖配送路径规划问题(目标函数:最优路径成本 含服务客户数量 服务时间 载量 路径长度)研究(Matlab代码实现)
|
2月前
|
算法 Python
【配送路径规划】基于遗传算法求解带时间窗的电动汽车配送路径规划(目标函数:最小成本;约束条件:续驶里程、额定载重量、数量、起始点)研究(Matlab代码实现)
【配送路径规划】基于遗传算法求解带时间窗的电动汽车配送路径规划(目标函数:最小成本;约束条件:续驶里程、额定载重量、数量、起始点)研究(Matlab代码实现)
|
4月前
|
存储 C语言
指针的函数传参的详细讲解(一)
本文介绍了计算机内存管理与C语言中指针的基本概念及应用。从内存单元的划分到指针的定义,解释了指针作为地址的作用及其数据类型特性。文章通过代码示例详细说明了一级指针、二级指针的使用方法,以及`void*`指针的特点和限制。此外,还探讨了指针运算规则、函数指针传参解引用的原理,并结合链表实例分析了一级与二级指针在实际场景中的区别。最后附带两道指针练习题,帮助读者巩固理解。
74 0
|
11月前
|
搜索推荐 Python
利用Python内置函数实现的冒泡排序算法
在上述代码中,`bubble_sort` 函数接受一个列表 `arr` 作为输入。通过两层循环,外层循环控制排序的轮数,内层循环用于比较相邻的元素并进行交换。如果前一个元素大于后一个元素,就将它们交换位置。
248 67
|
11月前
|
存储 人工智能 算法
数据结构实验之C 语言的函数数组指针结构体知识
本实验旨在复习C语言中的函数、数组、指针、结构体与共用体等核心概念,并通过具体编程任务加深理解。任务包括输出100以内所有素数、逆序排列一维数组、查找二维数组中的鞍点、利用指针输出二维数组元素,以及使用结构体和共用体处理教师与学生信息。每个任务不仅强化了基本语法的应用,还涉及到了算法逻辑的设计与优化。实验结果显示,学生能够有效掌握并运用这些知识完成指定任务。
202 4
|
12月前
|
存储 C语言 C++
如何通过指针作为函数参数来实现函数的返回多个值
在C语言中,可以通过将指针作为函数参数来实现函数返回多个值。调用函数时,传递变量的地址,函数内部通过修改指针所指向的内存来改变原变量的值,从而实现多值返回。
|
12月前
|
存储 搜索推荐 C语言
如何理解指针作为函数参数的输入和输出特性
指针作为函数参数时,可以实现输入和输出的双重功能。通过指针传递变量的地址,函数可以修改外部变量的值,实现输出;同时,指针本身也可以作为输入,传递初始值或状态。这种方式提高了函数的灵活性和效率。
|
12月前
|
算法 API 计算机视觉
人脸识别笔记(一):通过yuface调包(参数量54K更快更小更准的算法) 来实现人脸识别
本文介绍了YuNet系列人脸检测算法的优化和使用,包括YuNet-s和YuNet-n,以及通过yuface库和onnx在不同场景下实现人脸检测的方法。
462 1

热门文章

最新文章