S3-函数(1)

news/2025/2/22 16:05:59/

目录

1、函数是什么

2、C语言中函数的分类

     2.1 库函数

     2.2 自定义函数

3、函数的参数

    3.1 实际参数

    3.2 形式参数

4、函数的调用

    4.1 传值调用

    4.2 传址调用


1、函数是什么?

我们首先想到的是数学中的函数。

如:

y=f(x)

f(x)=x+1

f(1)=2

但是今天我要说的是C语言中的函数。

维基百科中对函数的定义:子程序

   ·  在计算机科学中,子程序(英语: Subroutine, procedure, function, routine, method,
subprogram, callable unit ),是一个大型程序中的 某部分 代码, 由一个或多个语句块组
成。它 负责完成某项特定任务 ,而且相较于其他代 码, 具备相对的独立性 。(如生活中一个大的项目,我们通常把它分成一个个小的模块,分配人员完成。)
    ·  一般会有输入参数并有返回值, 提供对过程的封装和细节的隐藏 。这些代码通常被集成为软件库。(如:库函数:size_t  strlen  (const char * str),我们知道strlen是求字符串长度的,但是不知道是怎么具体实现的。因为这个函数是C语言库里面直接提供的,调用就行了。)
说明:
1、注:有main的为主程序,
int  main()
{
.....
int  ret=get_max(a,b);//调用函数
return 0;
}
//函数
int  get_max(int x,int y)
{
return  (x>y?x:y);
}
函数可以把相对独立的某个功能抽象出来,使之成为程序中的一个独立实体。可以在同一个程序或其他程序中多次重复使用。
2、函数是C程序的基本功能单元,编写C程序实际上主要就是编写各种各样的函数。
3、函数对于构建程序并不是必需的,但却是非常重要的,它极大地增强了代码的模块性,使程序使程序变得更简短而清晰 、更易于开发和维护,提高了代码的重用性。

2、函数的分类

    2.1  库函数

    2.2  自定义函数

2.1库函数

为什么有库函数呢?
在编程的时候,我们有些功能经常频繁使用,不可能每次使用我们都重新编写吧。这个时候就出现了库函数。
例如:
1、频繁的需要在屏幕上打印数据:printf(),puts(),putchar()
2、 频繁的做一些字符串的拷贝工作: strcpy()
3、在计算时,总是会计算 n k 次方这样的运算: pow()
像上面我们描述的基础功能,它们不是业务性的代码。我们在开发的过程中每个程序员都可能用的到, 为了支持可移植性和提高程序的效率 ,所以C 语言的基础库中提供了一系列类似的库函数,方便程序员 进行软件开发
库函数这么多,我们怎么学习库函数呢?
建议:不用死背,重点是学会看文献
这为大家推荐一个网站学习: https://cplusplus,com - 搜索

 进去之后大家点击如上图:老版本(才能搜索)

简单的总结:C语言常用的库函数都有:

·  IO函数---input(输入),output(输出)函数

·  字符串操作函数----如:strcat(连接)、strcpy(拷贝)、strcmp(比较)、strlen
·   字符操作函数----strlwr(大写转换小写)、strupr(小写转换大写)、字符转换等等
·   内存操作函数---memcpy、memmove、memset等
·   时间 / 日期函数---time
·   数学函数---pow(计算x的y次幂)、sqrt(开平方根)、等等
·   其他库函数
如下:我们参照文档,学习库函数。

strcpy

 

 根据文档:strcpy的功能:

   把source中的内容拷贝到destination中,字符串结束的标志‘\0’也一同复制。

返回值:返回destination

Example(实例)

//strcmp的使用#include<string.h>
#include<stdio.h>
int main()
{//字符串拷贝//hello bitchar arr1[20] = { 0 };//arr1就是目的地char arr2[] = "hello bit";//arr2就是源头//把arr2中的字符串拷贝到arr1中strcpy(arr1, arr2);//数组名就是首地址printf("%s\n", arr1);return 0;
}

%s-打印字符串 (提供首地址,就开始打印直到'\0'结束)

memset

memset的功能:

把prt指向空间中前num个字节数据设置成value值 

 Example(实例)

//memset的使用#include<stdio.h>
#include<string.h>
int main()
{char arr[20] = "hello bit";printf("%s\n", arr);//这时想把hello改成xmemset(arr, 'x', 5);printf("%s\n", arr);return 0;
}

注:使用C语言库函数时,要用预编译命令"#include"将对应的“头文件”包含到用户源文件中。

就如:生活中你使用别人的东西,要先打招呼!

2.2 自定义函数

如果库函数能干所有的事情,那还要程序员干什么?
所有更加重要的是 自定义函数
自定义函数和库函数一样,有函数名,返回值类型和函数参数。
但是不一样的是这些都是我们自己来设计。这给程序员一个很大的发挥空间。
函数的组成:
ret_type  fun_name (para1,*)
{
     statement;//语句项
}
ret_type   返回类型
fun_name   函数名
para   函数参数(注:函数参数之间用逗号隔开)(*就是等等的意思)
函数体:由{}括起来的
那我们举一个例子:
写一个函数可以找出两个整数中的较大值。
#include<stdio.h>
int get_max(int x, int y)
{return (x > y ? x : y);
}
int main()
{int a = 0;int b = 0;//输入scanf("%d %d", &a, &b);//找出a和b中的较大值。int m = get_max(a, b);//推演函数的使用场景printf("%d\n", m);return 0;
}

小知识:F10----调试(监控)  F11---进入函数内部

若不成功:Fn+F10   

Fn---辅助功能键(+Fn是恢复该键以前的功能) 

函数的返回值:

1、函数的返回值是通过函数中的return语句获得的。 一个函数中可以有一个以上的return语句。但只有一个起作用。(先执行到哪个return语句,就是那个return语句起作用)

2、如果函数值的类型和return语句中表达式的值不一致,则以函数类型为准。(建议最好写成一样)

3、void

3、函数的参数

  3.1 实际参数(实参)

  3.2形式参数(形参)

3.1实际参数

真实传给函数的参数,叫实参。

实参可以是:常量、变量、表达式、函数等。

但注意:无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参。

3.2形式参数(形参)

形参是指(定义函数)函数名括号中的变量,因为形参只有在函数被调用的过程中才实例化(分配内存单元),所以叫形参。形参当函数调用之后就自动销毁了。因此形参只在函数中有效。

补充说明:

(1)形参与实参类型一致、顺序对应、个数相同  

(2)在被定义的函数中,必须指定形参的类型

(3)若形参与实参类型不一致,自动按形参类型转换

(4)形参与实参占用不同的内存单元,单向传递(实参传给形参)

例:写一个函数交换两个整形变量的内容

//代码1
#include<stdio.h>
void swap(int x, int y)
{int tmp = x;x = y;y = tmp;
}
int main()
{int a = 0;int b = 0;//输入scanf("%d %d", &a, &b);//用函数交换a和b的值swap(a, b);//调用函数printf("%d %d\n", a, b);return 0;
}

但是我们运行之后发现,并没有成功。

只是为什么呢?

调试 

 

实参a和b

形参x,y

使用的不是同一空间(地址不同)

当函数调用的时候,实参传递给形参,这时形参是实参的一份临时拷贝,对形参的修改不影响实参。 (即形参实例化之后其实相当于实参的一份临时拷贝

那我们怎么可以实现交换呢?这就是我接下来要讲的函数调用。

4、函数调用

   4.1  传值调用

   4.2  传址调用

4.1传值调用

函数的形参和实参分别占用不同内存块,对形参的修改不会影响实参。

4.2传址调用

1、传址调用是把函数外部创建变量的内存地址传递给函数参数(形参)的一种调用函数的方式。

2、这种传参方式可以让函数和函数外边的变量建立真正的联系,也就是函数内部可以直接操作函数外部的变量。

注:1、在一个函数中可以多次调用其他函数,在调用语句中的函数名必须与函数定义中的函数名相同。

2、实际参数应与被调用函数定义中的形式参数个数相同、位置对应并且类型一致。

3、被调用函数必须存在

真正实现两个数内容的交换:传址调用

#include<stdio.h>
//pa--指针变量(用来存放地址的)
//*pa解引用操作-作用就是通过pa中的地址,找到avoid swap(int* pa, int * pb)
{int tmp =*pa;//*pa就是a*pa= *pb;*pb = tmp;
}int main()
{int a = 0;int b = 0;scanf("%d %d", &a, &b);//用函数交换a,bswap(&a, &b);printf("%d %d\n", a, b);return 0;
}

 

注:地址是固定的,不能修改。 

 


http://www.ppmy.cn/news/203488.html

相关文章

hadoop and s3

一 :配置,hadoop-site.xml的配置如下 <property><name>fs.default.name</name><value>s3://BUCKET</value> </property><property><name>fs.s3.awsAccessKeyId</name><value>ID</value> </property>…

Amason S3 (一)

Amason S3 1.简介2.优势3.处理工具S3 BrowserCloudBerry Explorer 4. .NET开发 1.简介 Amazon S3(Simple Storage Service),是一个公开的服务云存储&#xff0c;云是一个抽象的概念&#xff0c;表示松散连接在一起的计算机组&#xff0c;这些计算机共同执行某项任务或者服务。…

AWS S3的使用

这两天Web这边有一个功能需求&#xff0c;使用到了AWS 的S3服务&#xff0c;这个东西在国内访问很慢&#xff0c;所以&#xff0c;一般也少有人使用&#xff0c;我们的业务主要在美国&#xff0c;所以&#xff0c;使用这个服务还是非常好的。国内的阿里云做到了云计算的龙头&am…

S3 文件操作使用实践

目录 1.引入 AWS SDK for Java2.x 2.创建 S3Client 3.上传对象 3.1 直接上传对象 3.2 分段上传对象 4.下载对象 4.1 下载对象到指定目录 4.2 完整性验证 4.2.1 未分段对象的验证 4.2.2 分段对象的验证 5.验证对象是否存在 6.风险和优化 1.引入 AWS SDK for Java2.x 通过 Maven …

s3下载

s3断点下载 两个概念 http request中的请求头有一个header为 range 该字段表明请求的下载流从什么地方开始下载 例如 RANGE&#xff1a; bytes2000070- 表明从2000070开始一直下载到最后 RANGE&#xff1a; bytes2000070-2000080 表明从2000070开始一直下载到2000080 如果在请…

亚马逊S3的使用

一、下载s3browser客户端 1、进入下载页面进行下载 下载亚马逊S3客户端地址 2、使用客户端进行连接公司亚马逊服务 连接成功之后的界面如下: 可以一目了然的看到上传之后的文件和文件目录存储结构。 二、亚马逊 AmazonS3的使用 1、引入pom依赖 <dependency><gro…

夏普GP2Y1010AU0F灰尘传感器使用

夏普GP2Y1010AU0F灰尘传感器在STM32平台上的使用 一、传感器的概述 GP2Y1010AUOF是日本夏普公司开发的一款光学灰尘浓度检测传感器。此传感器内部成对角分布的红外发光二极管和光电晶体管&#xff0c;利用光敏原理来工作。用于检测特别细微的颗粒&#xff0c;如香烟颗粒、细微灰…

Amazon S3 功能介绍

Amazon S3 功能介绍 1 存储过程 创建用于存储数据元的桶&#xff0c;可以选择数据元所驻留的地区&#xff08;目前来说&#xff0c;选择东京、新加坡会快些&#xff0c;美国本土更便宜&#xff09;&#xff0c;上传数据元到桶&#xff0c;进行持久化存储。另外&#xff0c;可以…