☘前言☘
今天是我开坑的第三天,大家最近应该都在忙期末把?答应我考完试来打卡好么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,先记住,等下解密。