函数传参:

1、形参变量属于它所在的函数,出了该函数就不能使用
2、实参与形参之间都是以赋值的形式进行数据传递(值传递)
3、return 其实是把返回值数据放置到一个公共的区域(函数和函数调用者),如果不写return语句,那么该区域中就是一个随机的垃圾数据
4、数组作为函数参数传递时,长度会丢失,需要额外增加一个变量把数组的长度也传递过去。
5、函数之间,数组的传递时址传递,函数与函数的调用者可以共享数组

练习1:实现一个函数,找出数组中的最大值

#include<stdio.h>int func(int a[],int len)
{int max=a[0];for(int i=1;i<len;i++){if(max<a[i])max=a[i];   }return max;
}int main(int argc,const char* argv[])
{int a[10]={0,1,2,3,4,5,6,7,8,155};int max= func(a,sizeof(a)/sizeof(a[0]));printf("%d",max);
}

练习2:实现一个函数,对数组进行排序

#include<stdio.h>void func(int a[],int len)
{int change;for(int i=0;i<len;i++){for(int j=i+1;j<len;j++){if(a[i]>a[j]){change=a[i];a[i]=a[j];a[j]=change;}}}
}int main(int argc,const char* argv[])
{int a[10]={15,95,18,19,47,85,63,25,98,46};int len=sizeof(a)/sizeof(a[0]);func(a,len);for(int i=0;i<len;i++){printf("%d ",a[i]);  }
}

练习3:实现一个函数,查找数组中是否存在某个值,如果存在,则返回该数据在数组中的下标,否则返回-1

#include<stdio.h>int func(int a[],int len,int n)
{for(int i=0;i<len;i++){if(a[i]==n)return i;    }return -1;
}int main(int argc,const char* argv[])
{int a[10]={0,2,1,3,4,5,6,7,8,9};int len=sizeof(a)/sizeof(a[0]);int ret=func(a,len,1);if(ret)printf("%d",ret);else printf("none");
}

设计函数时的准则:

1、一个函数最好只解决一个问题,这样可以降低出错率,提高可读性。
2、最好不要依赖其他函数。(降低耦合性)
3、数据由调用者提供,结果返回给调用者(提高通用性)
4、要考虑调用者提供的非法数据,可以通过返回值方式告诉调用者,或者把可能出现的情况通过注释的方式写明白(健壮性)

进程映像:

程序:储存在磁盘上的可执行文件(二进制文件、脚本文件)
进程:正在系统中运行的程序
进程映像:指的是进程内存的分布情况text    代码段: 存储二进制指令、常量,权限是只读,强制修改会产生段错误
data    数据段: 存储初始化过的全局变量、初始化过的静态局部变量
bss     静态数据段: 存储未初始化过的全局变量,未初始化过的静态局部变量,程序运行时会被清理为0
stack   栈: 存储局部变量、块变量,会随着程序运行不断申请、释放,由操作系统管理,小
heap    堆: 由程序猿手动管理,足够大

局部变量和全局变量:

局部变量: 定义在函数内存储位置: stack 栈生命周期: 函数调用开始直到知道函数执行结束使用范围: 函数内使用全局变量: 定义在函数外存储位置: data(初始化)、bss(未初始化)生命周期: 运行前就定义完成,程序结束才释放适用范围: 程序的任何位置都可以使用块变量: 定义在语句块内的 if{} for(){} while(){}存储位置: stack 栈生命周期: 函数调用开始直到知道函数执行结束使用范围: 只能在语句块内使用
注意:1、局部变量可以和全局变量同名但是会屏蔽同名的全局变量,同名块变量也会屏蔽同名的全局变量和局部变量2、建议全局变量首字母大写

存储介质:

硬盘->内存->高级缓存->寄存器

类型限定符:

auto:  用于定义自动申请、自动释放内存的变量(局部变量),不加就代表加注意:全局变量不能用auto修饰C11标准中auto用于自动类型识别auto num =3.14
extern: 声明变量,意思是说明此变量已在别处定义过了,请放心使用。但是只能临时通过编译,链接时找不到该变量,依然会报错声明时不可赋值
static:被它修饰过的局部变量叫静态局部变量改变存储位置:改变局部变量的储存位置,由stack改到data或bss(由是否初始化决定改到那个段)延长生命周期: 延长局部变量的生命周期限制作用域:限制全局变量、函数只能在本文件中使用,可以防止全局变量、函数被别人调用可以防止防止命名冲突
const:“保护”变量不被显示地修改注意:如果对初始化过的全局变量、初始化过的静态局部变量使用const修饰,那么存储位置会变成text
volatile:如果变量值没有显示地改变,那么在使用这个变量时,不会从内存中读取,而是继续用上次读取的结果,这叫编译器的取值优化。如果变量被volatile修饰后,每次使用该变量时,不做取值优化,每次都从内存中读取。一般在硬件编程、多线程编程时经常使用
register:申请把变量的存储介质由内存改为寄存器。但是由于寄存器有限,所以不一定能申请成功注意:寄存器变量不允许获取地址
typedef:类型重定义,定义变量前如果加入typedef,那么变量名就变成了这个类型注意:不是替换关系#define num int     替换typedef int num;    类型重定义从使用角度看一样

递归:

函数自己调用自己的行为,有可能会造成死循环
递归可以实现分治这种算法,就是把一个复杂的大问题,分解成若干个相同的小问题,直到问题解决1、出口问题2、解决一个小问题3、调用自己计算出第n个斐波那契数列
int func(int n)
{if(1== n||2 == n) return 1;return func(n-1)+func(n-2);
}
1 1 2 3 5 8 13.......递归函数每调用一次都会在栈内产生一份自己的拷贝,直到到达出口,才会一层一层的释放,因此使用递归时非常耗费内存,
与循环相比速度非常慢,能使用循环解决就用循环解决。不要试图分解递归的过程递归优缺点:1、耗内存、速度慢2、好理解、思路清晰3、可以解决非线性的执行过程

作业:

1、用编程模拟汉诺塔的移动过程
#include<stdio.h>void show(char a,char c,int n)
{printf("%d %c->%c\n",n,a,c);
}void func(int n,char a,char b,char c)
{if(n==1)show(a,c,n);else{func(n-1,a,c,b);show(a,c,n);func(n-1,b,a,c);}
}int main(int argc,const char* argv[])
{int n;scanf("%d",&n);func(n,'A','B','C');return 0;
}
2、输入一个整数,计算出0~9每个数字出现几次
#include<stdio.h>void func(int n,char a[])
{if(n==0)return;a[n%10]++;func(n/10,a);
}int main(int argc,const char* argv[])
{int n;scanf("%d",&n);char a[10]={};func(n,a);for(int i=0;i<10;i++){printf("%hhd:%hhd ",i,a[i]); }
}

学习笔记9-C语言-传参、类型限定符、递归相关推荐

  1. C语言中的类型限定符.const限定符

    目录 1.1const限定符 1.1.1const限定符修饰普通对象 1.1.2const限定符修饰数组元素 1.1.3const限定符修饰指针类型对象 1.1.4const限定符修饰函数形参类型为数 ...

  2. C语言中的类型限定符有哪些?

    C语言中有一些关键字起到了限定的作用,他们被称为限定符,那么在C语言中共有几个限定符呢?他们的作用分别是什么呢?本文主要介绍C中4个限定符 1.const2.volatile3.restrict4._ ...

  3. React学习:路由定义及传参、数据复用-学习笔记

    文章目录 React学习:路由定义及传参.数据复用-学习笔记 在React中使用react-router-dom路由 简单例子 路由定义及传参 React学习:路由定义及传参.数据复用-学习笔记 在R ...

  4. Java快速入门学习笔记2 | Java语言中的基本类型

    有人相爱,有人夜里开车看海,有人却连LeetCode第一题都解不出来!虽然之前系统地学习过java课程,但是到现在一年多没有碰过Java的代码,遇到LeetCode不知是喜是悲,思来想去,然后清空自己 ...

  5. C语言编译报错:incompatible pointer type [-Wincompatible-pointer-types](传参类型不匹配)

    代码: //arnold add 20211213size_t save_video_box_buffer_size = 1920*1080*3/2;char* save_video_box_buff ...

  6. [UVMC]UVMC学习笔记之跨语言作用域的config操作

    UVMC学习笔记二 --- 跨语言作用域的config操作 前言:UVMC引入了特定的内存共享方法,可以在UVM/SystemVerilog与SystemC模块之间传递记名的半全局变量,在使用方式上类 ...

  7. 【学习笔记】C++语言程序设计(郑莉):数据的共享与保护

    [学习笔记]C++语言程序设计(郑莉):数据的共享与保护 1. 标识符的作用域与可见性 1.1 作用域 1.1.1 函数原型作用域 1.1.2 局部作用域 1.1.3 类作用域 1.1.4 命名空间作 ...

  8. 【学习笔记】C++语言程序设计(郑莉):继承与派生

    [学习笔记]C++语言程序设计(郑莉):继承与派生 1. 类的继承与派生 1.1 派生类的定义 1.2 派生类生成过程 2. 访问控制 3. 类型兼容规则 4. 派生类的构造和析构函数 4.1 构造函 ...

  9. c语言注释语句执行吗,C语言学习笔记之C语言概念解析(附资料分享)每一个语句都必须以分号结尾但预处理命令函数头和花括号“}”之后不能加分号...

    [[怪兽爱C语言]C语言学习笔记之C语言概念解析(附资料分享)]https://toutiao.com/group/6582429294901854728/?iid=15906422033&a ...

最新文章

  1. html5游戏 虚拟主机,基于HTML5的云虚拟主机配置界面
  2. 所见所得php网页,Pwnium CTF之所见所得所想
  3. AI正在如何重塑生活和消费?头部企业齐聚,邀你共谈智能产业新机会
  4. POJ3692 最大点权独立集元素个数
  5. RUNNING JUPYTER NOTEBOOKS ON A REMOTE SERVER VIA SSH
  6. Visual Studio怎么使用中文帮助文档
  7. git删除本地分支、删除远程分支 复制分支
  8. 从零开始构建一个的asp.net Core 项目(一)
  9. wps中图片怎么居中_wps图片怎么添加推动声
  10. 神经网络风格迁移更新篇
  11. Android 手机卫士--解析json与消息机制发送不同类型消息
  12. 虚拟机访问本地mysql_MySQL高可用之主从复制
  13. python编程语言-python与其他编程语言区别全在这
  14. 如何实现LBS轨迹回放功能?含多平台实现代码
  15. 如何绕过mac地址过滤_如何通过路由器来过滤无线MAC地址
  16. PACP学习笔记三:PCAP方法说明
  17. 世界杯已开赛,哪些看球设备让你觉得身临其境?
  18. matplotlib作图系列之内置颜色使用(一)
  19. Windows server 2008 关闭135端口
  20. 雨课堂知识点总结(十八)

热门文章

  1. epoll怎么实现的
  2. muduo for v210
  3. ifcfg-eth0 配置
  4. MULTI BIN的wince 5.0,smdk2440下的实现
  5. Qt中的角度和正方向描述清单
  6. 【 POJ - 3628 】Bookshelf 2(dfs 或 dp,0-1背包)
  7. 【CSU - 1980 】不堪重负的树(树上区间dp)
  8. 【POJ - 1995】Raising Modulo Numbers(裸的快速幂)
  9. 机器学习笔记(2):单变量线性回归
  10. python bind sock_python 在bind端口之后创建的socket如果不关闭的话会被回收吗?