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

函数传参:

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/443459.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Oracle创建视图实现获取当前数据所在的页数,这里以每页2条数据分页

摘要&#xff1a;Oracle创建视图实现获取当前数据所在的页数&#xff0c;这里以每页2条数据分页&#xff0c;详细请看&#xff1a; 一&#xff1a; DROP VIEW MIP.TB_CMS_FLGTINFO_D_VIEW;/* Formatted on 2014/12/4 8:35:36 (QP5 v5.115.810.9015) */ CREATE OR REPLACE FOR…

学习笔记10-C语言-小项目-五子棋

小项目&#xff1a; 需要的数据 1、定义棋盘的二维数组 2、定义变量用于记录下棋的坐标 3、定义角色 黑棋 O 白棋 * 空位业务逻辑&#xff1a; 是否需要对数据初始化 for(;;) {1、清屏、显示棋盘2、落子坐标是否合法、该位置是否有棋子3、判断是否五子连珠4、交换角色5、显示…

学习笔记11-C语言-指针

什么是指针&#xff1a; 指针是一种特护的数据类型&#xff0c;使用它可以定义指针变量&#xff0c;指针变量存储的是整型数据&#xff0c;代表内存的编号&#xff0c;通过这个编号可以访问到对应内存。为什么使用指针 1、函数与函数之间是相互独立的&#xff0c;但是有些时候…

学习笔记12-C语言-堆内存、字符串

什么是堆内存&#xff1a; 是进程中的一个内存段&#xff08;text\data\bss\heap\stack&#xff09;&#xff0c;由程序猿手动控制。 特点是足够大&#xff0c;缺点是使用麻烦为什么要使用堆内存&#xff1a; 1、随着程序的复杂&#xff0c;数据会越来越多。 2、其他的内存段…

学习笔记13-C语言-字符串函数、缓冲区

字符串的常用函数: #include<string.h> size_t strlen(const char* s); 功能&#xff1a;计算字符串长度&#xff0c;但是结果不包括\0 返回值&#xff1a;返回字符串中字符的个数size_t str_len(const char* str) {assert(NULL ! str);const char* tmp str;while(*tmp…

Oracle数据库里面查询字符串类型的字段不为空和为空的SQL语句:

摘要&#xff1a;近期项目中&#xff0c;在做高级查询的时候有个条件是根据选择的字段&#xff0c;然后再选择字段的值为空和不为空做查询&#xff0c;在写SQL语句的时候费了很长时间&#xff0c;现在记录一下&#xff0c;方便日后查看&#xff1a; 一&#xff1a;查询字符串类…

学习笔记14-C语言-小项目-通讯录

通讯录&#xff1a; 要求&#xff1a; 姓名&#xff0c;性别、电话&#xff0c;最多储存50个联系人 功能&#xff1a;1、添加联系人2、按名字删除联系人3、按姓名修改联系人信息4、查找联系人&#xff0c;可通过电话&#xff0c;名字查找&#xff0c;支持模糊查找5、显示所有联…

学习笔记15-C语言-预处理指令、条件编译、头文件

预处理指令&#xff1a; 程序猿编写的代码不是标准C代码&#xff0c;并不能被真正的编译器索编译&#xff0c;需要一段程序把代码翻译一下。 翻译的过程叫做预处理&#xff0c;被翻译的代码叫做预处理指令&#xff0c;以#开头的都是预处理指令查看预处理的过程&#xff1a;gcc…

学习笔记16-C语言-小项目-使用Makefile完成2048

Makefile: Makefile是一系列编译指令组成的可执行文本&#xff0c;也叫做编译脚本。 在终端执行make命令会自动执行Makefile脚本中的编译命令&#xff0c; 而且它还可以根据文件的最后修改时间来判断哪些文件是否需要重新编译、哪些文件不需要重新编译&#xff0c;从而大大提高…

学习笔记17-C语言-结构、联合、枚举

结构&#xff1a; struct 结构是由程序猿自己设计的一种数据类型&#xff0c;用于描述一个事务的各项数据&#xff0c;由若干个不同的基础数据类型组成。设计结构&#xff1a;struct 结构体名{类型 成员名&#xff1b;...}&#xff1b;定义结构体变量struct 结构体名 变量名&a…

Maven 3.0.5 安装和配置:

摘要&#xff1a;现在的Web项目越来越多的都用maven管理了&#xff0c;所以我也抽时间学习学习&#xff0c;为了赶上时代&#xff01; 一&#xff1a;首先到maven官网&#xff1a;http://maven.apache.org/&#xff0c;然后选择相应的版本下载&#xff0c;我这里下载的是maven…

学习笔记18-C语言-文件

文件的分类&#xff1a; 文本文件&#xff1a; 存储的是ASCII码值的二进制 二进制文件&#xff1a; 存储的是数据的补码文件IO&#xff1a; FILE *fopen(const char *path, const char *mode); 功能&#xff1a;打开或者创建文件 path&#xff1a;文件的路径 mode&#x…

使用INNER JOIN ON 多表关联查询,获取指定用户下指定权限的资源SQL:

摘要&#xff1a;最近在看一个开源框架&#xff0c;其中用户&#xff0c;角色&#xff0c;资源&#xff0c;这块我感觉比较重要&#xff0c;所以就自己也模仿着写了下&#xff0c;其中在获取指定用户下的权限资源的时候遇到问题了&#xff0c;开始时&#xff0c;我首先想到的方…

Maven学习记录之maven基本操作命令,maven本地工厂的创建,maven骨架的生成,以及在eclipse中创建maven工程:...

摘要&#xff1a;今天又学习了一下maven&#xff0c;之前是下载并安装和配置好了maven的环境&#xff0c;今天主要学习的内容包括&#xff1a;maven本地工厂的创建&#xff0c;maven骨架的生成命令&#xff0c;maven在dos下创建maven工程&#xff0c;以及在eclipse中创建mavne工…

Oracle中通过游标执行带参数的存储过程实现解析CLOB字段内的xml字符串:

摘要&#xff1a;近来之前的项目数据出现了问题&#xff0c;原因是由于之前在设计数据库的时候把时间字段设置成了字符串格式&#xff0c;所以给后期的数据操作带来了很大的麻烦&#xff0c;这里提醒一下各位程序猿&#xff0c;以后在开发项目的时候时间字段一定要是时间字段&a…

Eclipse中使用Checkstyle,checkstyle插件检查java代码的自定义配置文件:

摘要&#xff1a;近来项目组在搞代码检查&#xff0c;所以领导让把checkstyle这个插件搞明白&#xff0c;现在我把我们写的自定义的checkstyle.xml文件记录一下&#xff0c;以便大家可以一起使用&#xff1a; 一&#xff1a;要使用checkstyle插件在eclipse中检查java代码&…

Linux 下安装 jdk-7u75-linux-x64.gz,jdk1.7.0_75,jdk1.7步骤:

摘要&#xff1a;近来又用到了Linux系统&#xff0c;所以就又新装了一个虚拟机和CentOS 6.4来用&#xff0c;搞开发的程序猿们可能都知道&#xff0c;在现在的很多企业中&#xff0c;生产环境大多都是Linux服务器&#xff0c;并且用的比较多的大都是CentOS&#xff0c;Red hat系…

Win7+VMware10.0+CentOS 6.4+Tomcat,Win7访问不了CentOS6.4上的Tomcat

摘要&#xff1a;今天在linux下安装Tomcat后&#xff0c;在虚拟机本地通过:http://localhost:8080/可以访问安装好的Tomcat服务器&#xff0c;但是在本机就不能访问&#xff0c;前提是在本机下可以ping的通虚拟机的IP地址的&#xff0c;最后经过Google&#xff0c;发现说可能是…

Linux下配置OpenLDAP服务记录

摘要&#xff1a;最近部门需要整合所有的系统&#xff0c;所以领导说要通过OpenLdap数据库来实现对所有系统的统一管理&#xff0c;所以需要在服务器上配置一下LDAP服务&#xff0c;我们这里选择的是OpenLdap服务&#xff0c;我在网上搜索了很多&#xff0c;开始都没有配置成功…

Linux下配置CollabNet Subversion Edge

摘要&#xff1a;最近一直都在搞一下管理员的工作&#xff0c;今天又搞了svn的管理工具CollabNetSubversionEdge&#xff0c;网上也有很多例子&#xff0c;但是很多都是可以访问到web界面&#xff0c;但是不能启动版本库的服务&#xff0c;所以我经过多次尝试&#xff0c;终于解…