【C语言】函数(二):函数调用与链式访问

目录

  • 函数调用
    • 传值调用
    • 传址调用
    • 练习题
  • 嵌套调用
  • 链式访问

函数调用

函数调用分为传值调用和传址调用

传值调用

传值调用时,函数的形参和实参分别有着自己的内存空间,形参的改变不会影响实参。在上文中说到的利用一个函数实现两个整数的交换的错误写法就是因为我们将它传值调用。

传址调用

传址调用是把函数外部创建的变量的地址传递给函数参数(也就是通过指针访问函数外部的变量)。这样的方式可以让函数与函数外部的变量建立起真正的联系,可以在函数内部直接操作函数外部的变量。在上文中说到的利用一个函数实现两个整数的交换的正确写法就是因为我们将它传址调用。房子里面的内容会变,但房子本身并不会变。

练习题

1.写一个函数判断一个数是不是素数。

#include<stdio.h>
#include<math.h>int is_prime(int x)
{for (int j = 2; j <= sqrt(x); j++) //方法不唯一{if (x % j == 0)return 0; //不是素数返回0}return 1; //是素数返回1
}
int main()
{int i = 0;int n = 0;scanf("%d", &n);for (i = 2; i <= n; i++) //最小的素数是2{if (is_prime(i) == 1)printf("%d ", i);}return 0;
}

2.写一个函数判断某一年是不是闰年。

#include<stdio.h>int is_leap_year(int x)
{return ((x % 4 == 0) && (x % 100 != 0)) || (x % 400 == 0);//满足条件则为真
}
int main()
{int year_start = 0;int year_end = 0;scanf("%d %d", &year_start, &year_end);for (int i = year_start; i <= year_end; i++){if (is_leap_year(i) == 1)printf("%d ", i);}return 0;
}

3.写一个函数,实现整型有序数组的二分查找。

#include<stdio.h>int binary_search(int arr[], int n, int sz)
{int left = 0;int right = sz - 1;while (left <= right){//int mid = (left + right) / 2; //不建议这样,容易导致溢出int mid = left + (right - left) / 2;if (arr[mid] < n){left = mid + 1;}else if (arr[mid] > n){right = mid - 1;}else return  mid;}return -1;
}
int main()
{int arr[] = { 1,2,3,4,5,6,7,8,9,10 };int n = 0;scanf("%d", &n);int sz = sizeof(arr) / sizeof(arr[0]);int result = binary_search(arr, n, sz);if (result == -1)printf("没找到\n");else printf("找到了,下标是%d", result); return 0;
}

嵌套调用

函数与函数之间可以互相调用。

示例:

#include<stdio.h>void fx1()
{printf("hello world\n");
}void fx2()
{for (int i = 0; i < 3; i++){fx1();}
}
int main()
{fx2();return 0;
}

注意:函数可以嵌套调用,但是不能嵌套定义

//错误示范伪代码
int add() //定义add函数
{int x = 0;int y = 0;return x + y;void pt() //定义pt函数{printf("hello world\n");}
}

链式访问

链式访问是把一个函数的返回值作为另外一个函数的参数。

将库函数的返回值作为库函数的参数肯定是最简单的:

//求字符串长度
#include<stdio.h>
#include<string.h>int main()
{//int length = strlen("abcdefg");//printf("%d\n", length);printf("%d\n",strlen("abcdefg"));return 0;
}

我们再来看一个:

#include<stdio.h>int main()
{printf("%d", printf("%d", printf("%d", 43)));//没空格printf("\n");printf("%d ", printf("%d ", printf("%d ", 43)));//有空格return 0;
}

没空格和有空格这两行输出的结果一样吗?
在这里插入图片描述
我们发现结果并不一样,打开cpluspluss网站,搜索printf:
在这里插入图片描述
所以说,printf的返回值是打印在屏幕上字符的个数,分析一下:
在这里插入图片描述

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

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

相关文章

进程API

linux下进程的api forkwaitexec fork #include <stdio.h> #include <stdlib.h> #include <unistd.h>/* linux环境运行 子进程并不是完全拷贝了父进程。具体来说&#xff0c;虽然它拥有自己的 地址空间&#xff08;即拥有自己的私有内存&#xff09;、寄存器…

分布式锁3: zk实现分布式锁

一 zk 实现分布式锁 1.1 zk分布式操作命令 1.指令&#xff1a; ls / get /zookeeper create /aa "test" delete /aa set /aa "test1" 2..znode节点类型&#xff1a; 永久节点&#xff1a;create /pa…

人工智能-循环神经网络的简洁实现

循环神经网络的简洁实现 如何使用深度学习框架的高级API提供的函数更有效地实现相同的语言模型。 我们仍然从读取时光机器数据集开始。 import torch from torch import nn from torch.nn import functional as F from d2l import torch as d2lbatch_size, num_steps 32, 35…

【AI】行业消息精选和分析(11月22日)

今日动态 &#x1f453; Video-LLaVA&#xff1a;视觉语言模型革新&#xff1a; - 图像和视频信息转换为文字格式。 - 多模态理解能力&#xff0c;适用于自动问答系统等。 &#x1f4c8; 百度文心一言用户数达7000万&#xff1a; &#x1f50a; RealtimeTTS&#xff1a;实时文本…

还记得高中生物书上的莫斯密码吗?利用Python破解摩斯密码的代码示例!

文章目录 前言摩尔斯电码Python实现摩斯密码对照表加密解密测试 完整代码总结关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Python学习书籍四、Python工具包项目源码合集①Python工具包②Python实战案例③Python小游戏源码五、面试资料六、Py…

力扣.面试题 04.06. 后继者(java 树的中序遍历)

Problem: 面试题 04.06. 后继者 文章目录 题目描述思路解题方法复杂度Code 题目描述 设计一个算法&#xff0c;找出二叉搜索树中指定节点的“下一个”节点&#xff08;也即中序后继&#xff09;。 如果指定节点没有对应的“下一个”节点&#xff0c;则返回null。 思路 由于题…

「Docker」如何在苹果电脑上构建简单的Go云原生程序「MacOS」

介绍 使用Docker开发Golang云原生应用程序&#xff0c;使用Golang服务和Redis服务 注&#xff1a;写得很详细 为方便我的朋友可以看懂 环境部署 确保已经安装Go、docker等基础配置 官网下载链接直达&#xff1a;Docker官网下载 Go官网下载 操作步骤 第一步 创建一个…

【SpringBoot】ThreadLocal 的详解

一、ThreadLocal 简介 ThreadLocal 叫做线程变量&#xff0c;意思是 ThreadLocal 中填充的变量属于当前线程&#xff0c;该变量对其他线程而言是隔离的&#xff0c;也就是说该变量是当前线程独有的变量。ThreadLocal 为变量在每个线程中都创建了一个副本&#xff0c;那么每个线…

虚拟机centos设置网络模式(桥接|NAT)

前言 桥接模式是通过物理网卡直接与外部网络建立联系的&#xff0c;而NAT模式则是通过虚拟网卡VMnet1或VMnet8通过宿主机共享IP与外部建立网络关系当需要将虚拟机资源共享给局域网用户使用时&#xff0c;宜采用桥接模式&#xff1b;当需要保护虚拟机资源&#xff0c;确保只能由…

封面从这里取好啦

文章目录 前端NPMViteNode.js 后端JavaMavenPython 数据库算法 前端 NPM Vite Node.js 后端 Java Maven Python 数据库 算法

C#使用whisper.net实现语音识别(语音转文本)

目录 介绍 效果 输出信息 项目 代码 下载 介绍 github地址&#xff1a;https://github.com/sandrohanea/whisper.net Whisper.net. Speech to text made simple using Whisper Models 模型下载地址&#xff1a;https://huggingface.co/sandrohanea/whisper.net/tree…

【wireshark】基础学习

TOC 查询tcp tcp 查询tcp握手请求的代码 tcp.flags.ack 0 确定tcp握手成功的代码 tcp.flags.ack 1 确定tcp连接请求的代码 tcp.flags.ack 0 and tcp.flags.syn 1 3次握手后确定发送成功的查询 tcp.flags.fin 1 查询某IP对外发送的数据 ip.src_host 192.168.73.134 查询某…