C++学习(二十)(C语言部分)之 函数1
函数
printf 输出的函数
scanf 输入的函数
函数是什么 怎么写
是一组一起执行一个任务的语句
一个程序的基本组成单位是函数
只需要知道函数名字和括号里面要填的内容 就可以调用函数
1、如果代码中有重复的语句--->写成函数 可以缩短代码量 提高效率
2、用的时候知道函数名+参数 直接调用 有问题时 只需要检查单个函数
int main()
int 函数类型/返回值类型
main 函数名字
() 里面要写参数 如果里面不写 表示没有参数 或者写void 都表示没有参数
{} 里面是函数体
return 跳出这个函数 后面如果有值 称之为返回值
如果返回值类型void return 后面可以不加内容也可以省略return
return 后面的值由前面的函数类型决定
void main()
{
return;//后面不需要加值 或者可以省略
}
void 表示空 1、放在函数名前面(返回值类型) 表示函数没有返回值
2、放函数()里面 表示函数没有参数
比较常用的函数 (一般情况下是看不到函数体的)
void outtextxy(int x,int y,LPCTSTR str);
1、知道怎么用 函数+参数调用 函数作用
2、返回值 返回值作用
stecmp 比较两个字符是否相等
malloc 申请内存 返回申请的内存的首地址
定义函数的时候--->函数()里面的是参数 int a,int b
调用的函数的时候 函数括号里面的参数is_Max(x,y,z) 实参
形参 定义时候的参数 自己取的名字 函数内部使用的参数
实参 指实际参数 在调用函数的时候用的参数 可以使变量可以使常量 作用是将一个值传递给形参
实参与形参只是赋值的关系
调用时 是把实参的值赋给了形参
修改形参时,并不会影响实参
从主函数(main)开始 从上往下
遇到调用函数的位置 用实参给形参赋值 调用之后return到调用的位置
继续往下执行
形参的值不会影响实参
通过传递地址的方式,修改主函数的变量、数组(指针的作用之一)
调用之前先定义函数-->直接定义
如果是在调用之后定义的函数 必须在前面刷存在感(就是将定义的函数放在主函数之后时,在调用的时候提前声明)
返回值+函数名+参数
代码:
1、头文件
2、类型定义,全局变量
3、函数声明
4、主函数
5、函数定义
关于函数声明 函数定义中的形参名字 (如果有的话)必须保持一致
声明 刷存在感 (声明中的 参数名字可以省略不写
递归 和函数参数的写法
作用域
变量作用域 生存周期
{} if for 函数{}
在{}定义的变量 出了{}不能用 {}作用域
1、全局变量 函数外部定义 作用域 作用于整个文件 生存周期 程序运行时间
2、局部变量 {}定义 作用域只作用于{]里面 生存周期 出了{}自动回收
3、静态变量 statie修饰的变量 生存周期 通全局变量
作用域 看它定义的位置
stayic 静态变量 只会定义一次 下一次接着上一次的值继续使用
测试代码:
#include<stdio.h>
#include<string.h>
#if 0
/*设计一个函数
1、确定函数的功能 例如 比较三个数字那个最大
2、取函数名字 不能和已有的标识符 关键字 函数重名
is_Max(a,b,c) 参数 确定顺序 确定个数 参数类型
3、返回值 可以先写void
//is_Max(a,b,c)
参数 确定顺序 确定个数 参数的类型
调用的时候()里面可以使变量 页可以是常量 */
int is_Max(int a,int b,int c)
{
//c = 22;
if (a > b)
{
if (a > c)
{
//printf("a最大");
return a;//可以返回一个值 最大值
}
else
{
return c;//有返回值 前面函数类型要对应为int
}
}
else
{
if (b > c)
{
return b;
}
else
{
return c;
}
} //return;
}
//自定义函数 可以写在主函数体之前 或者之后
//写在主函数之前在主函数里面调用的时候可以直接调用
//写在主函数之后在主函数里面调用的时候需要在主函数值前进行函数声明
#endif int x;//全局变量 作用域 作用于整个文件 生存周期程序运行时间 void swapint(int a, int b)
{
int temp = a;
a = b;
b = temp;
printf("函数里面a=%d,b=%d\n",a,b);
}
void swapPoint(int *p, int *q)
{
int temp = *p;
*p = *q;
*q = temp;
printf("主函数中a=%d,b=%d\n",*p,*q); } void fun()
{//作用域在{}里面 但是出了{}之后不会被系统回收
static int x = ;//static修饰的变量 定义只定义一次
x++;
printf("%d",x);
} int main()//主函数
{
////代码
//printf("hello");//有参数的函数
////1、int *p = (int*)malloc(sizeof(int));//返回值 返回被调用的函数 返回值赋值给p
//int t=is_Max(1, 2, 3);//函数调用 返回值是int 定义一个int变量来接收
////is_Max 把1的值赋给了a 把2值赋给了b 然后把3值赋给了c
//printf("%d",is_Max(1,2,3));
//int x = 1, y = 2, z = 3;
//is_Max(x, y, z);
//printf("hello");//有参数的函数 int a = , b = ;
swapint(a, b);//通过函数交换ab的值
printf("主函数中a=%d,b=%d",a,b);
swapPoint(&a, &b);
printf("主函数中a=%d,b=%d\n",a,b); //if (1)
//{
// int myint;
// myint = 1;
//}
////myint = 1; 不可用
fun();
fun();
fun(); getchar();//没有参数的函数
return ;
}
附:
形参和实参
函数
//class 1-------------------------------------------------------------------------------------------------------------------------------------//
- 函数 一组一起执行一个任务的语句 是程序的基本单位
- 函数作用
- 封装代码 使用的用户不需要知道函数如何实现 只需要知道函数功能就可以使用
- 节省代码行数 对于一些需要重复使用的代码段 用函数可以缩短代码 提高编程效率
- 函数组成
- 函数名
- 函数的名字(自己定义)
- 调用的时候知道函数名和参数即可调用
- 函数类型(返回值类型)
- 定义的时候写在函数前面的类型 函数后面return后面的类型一致
- 如果函数不返回任何值 返回类型写void return后面不写任何值(也可以省略return)
- 参数
- 函数括号中的内容称之为参数 调用的时候需要传递值进去
- 函数体
- 函数具体执行内容的语句
- 函数名
- 函数的定义和使用方式
- 函数定义 提供了函数的实际主体(必须有)
- 函数使用 调用函数的方式 函数名(参数)
- 函数声明 函数如果在调用之后定义 需要加上函数声明
- 函数声明一般放前面 包含函数类型 函数名和参数类型(参数名可以省略)
- 形参和实参
- 形参 函数在定义时候括号中的参数称之为形参
- 实参 函数在调用的时候括号中的参数称之为实参
- 形参和实参可以同名 但是并不是同一个变量 不占同一块内存 修改形参并不会影响实参 形参不改变实参
- 通过指针可以直接通过地址修改调用函数中的变量
- 函数作用
//class 2-----------------------------------------------------------------------------------------------------------------------------------//
- 递归
- 函数在函数定义的时候调用本身(自己直接或者间接调用自己)称之为递归
- 优点
- 少量代码即可描述出一个需要重复计算的问题
- 循环能实现的递归都能实现,但是递归能实现的,循环未必能实现
- 缺点
- 相当于其他常用方法(比如循环)效率较低
- 每次调用都会为参数和返回值开辟栈区内存 递归次数过多容易引发栈溢出
- 注意事项
- 作用域
- 在{}内部定义的变量都是局部变量 作用域只在这个{}中(比如函数中 或者if和for的括号中)
- 在{}外部定义的是全局变量 全局变量可以使用在定义之后的任何函数中
- 不同作用域之间的变量允许同名 不会重定义
- 有多个不同作用域之间的同名变量 使用的是最近定义的一个在作用域内的变量(就近原则)
- 命名规则
- 函数名命名规则同变量命名规则
- 只能数字字母下划线组成 不能用其他字符 不能使用关键字
- 函数定义和函数声明要保持一致 返回值类型 函数名 参数(如果声明中有形参名字 这个要和定义的时候保持一致)
- 函数的形参不能改变实参
- 作用域
- 了解
- 指针函数 返回值为指针的函数 比如strcpy strcat返回的都是指针 malloc
- 函数指针 指向函数的指针
- 一般用于传递函数名作为参数的情况
- 写法 比如int fun(int x)--->对应的函数指针 int (*pfun)(int)函数名换成(*pfun)就行
- 函数指针赋值后使用方式同函数名一样
2018-11-16 09:39:15
C++学习(二十)(C语言部分)之 函数1的更多相关文章
- 剑指Offer(二十):包含min函数的栈
剑指Offer(二十):包含min函数的栈 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net/ba ...
- Java开发学习(二十二)----Spring事务属性、事务传播行为
一.事务配置 上面这些属性都可以在@Transactional注解的参数上进行设置. readOnly:true只读事务,false读写事务,增删改要设为false,查询设为true. timeout ...
- Java开发学习(二十四)----SpringMVC设置请求映射路径
一.环境准备 创建一个Web的Maven项目 参考Java开发学习(二十三)----SpringMVC入门案例.工作流程解析及设置bean加载控制中环境准备 pom.xml添加Spring依赖 < ...
- Java开发学习(二十五)----使用PostMan完成不同类型参数传递
一.请求参数 请求路径设置好后,只要确保页面发送请求地址和后台Controller类中配置的路径一致,就可以接收到前端的请求,接收到请求后,如何接收页面传递的参数? 关于请求参数的传递与接收是和请求方 ...
- Java开发学习(二十六)----SpringMVC返回响应结果
SpringMVC接收到请求和数据后,进行了一些处理,当然这个处理可以是转发给Service,Service层再调用Dao层完成的,不管怎样,处理完以后,都需要将结果告知给用户. 比如:根据用户ID查 ...
- Java开发学习(二十八)----拦截器(Interceptor)详细解析
一.拦截器概念 讲解拦截器的概念之前,我们先看一张图: (1)浏览器发送一个请求会先到Tomcat的web服务器 (2)Tomcat服务器接收到请求以后,会去判断请求的是静态资源还是动态资源 (3)如 ...
- Python学习二十八周(vue.js)
一.指令 1.一个例子简单实用vue: 下载vue.js(这里实用1.0.21版本) 编写html代码: <!DOCTYPE html> <html lang="en&qu ...
- Python3.5 学习二十四
本节课程大纲: -------------------------------------------------------------------------------------------- ...
- 渗透测试学习 二十、 其他漏洞汇总之PHP相关漏洞
大纲: PHP相关漏洞 JSP相关漏洞 其他漏洞汇总 PHP相关漏洞 文件包含漏洞 php://input等伪协议利用 代码执行漏洞 变量覆盖漏洞 文件包含漏洞 程序开发人员一般会把重复使用的函数写到 ...
- Scala学习二十二——定界延续
一.本章要点 延续让你可以回到程序执行当中之前的某个点; 可以在shift块中捕获延续 延续函数一直延展到包含它的reset块的尾部 延续所谓的”余下的运算“,从包含shift的表达式开始,到包含它的 ...
随机推荐
- js的event.preventDefault()与event.stopPropagation()
event.preventDefault()用法介绍 该方法将通知 Web 浏览器不要执行与事件关联的默认动作(如果存在这样的动作).例如,如果 type 属性是 "submit" ...
- day02 运算符和编码
今日所学 主要是运算符和编码的初认识, 1 还有比较运算 ==,!=,<>,>,<,>=,<=等 2 . 赋值运算 =,+=,-=等 还有今天的难点逻辑运算 ...
- python学习例子
http://www.runoob.com/python/python-100-examples.html
- VCL界面控件DevExpress VCL发布v18.2.2|附下载
DevExpress VCL Controls是 Devexpress公司旗下最老牌的用户界面套包.所包含的控件有:数据录入,图表,数据分析,导航,布局,网格,日程管理,样式,打印和工作流等,让您快速 ...
- Intellij IDEA生成foreach或者loop 快捷键
iter Iterate (for each..in) itin Iterate (for..in) itli Iterate over a List itar Iterate elements of ...
- 100Mbps和100MB/s
作为毕业2年计算机专业的学生,现在才知道100Mbps和100MB/s的概念,实在是渣. Mbps=Mbit/s即兆比特每秒.Million bits per second的缩写传输速率是指设备的的数 ...
- 解决NPM无法安装任何包的解决方案(npm ERR! code MODULE_NOT_FOUND)
前言 今天突然发现npm无法使用了,执行任何命令都报如下错误: npm ERR! code MODULE_NOT_FOUND npm ERR! Cannot find module 'internal ...
- Highcharts 柱图 每个柱子外围的白色边框
Highcharts 柱图中每条柱外会有默认白色的边框, 去边框代码如下: plotOptions: { bar: { borderColor: "",//去边框 } }
- mvc项目中实现备份数据库(sqlserver2005)
功能要求:mvc项目,实现数据库备份(bak文件) 实现步骤:<a id="backupDB" href="javascript:" >数据库备份& ...
- Final发布
作业要求[https://edu.cnblogs.com/campus/nenu/2018fall/homework/2476] 文案+美工[https://www.cnblogs.com/erciy ...