首页 > 其他分享 >从最浅层剖析C语言————第六节(深入了解数组传参、嵌套调用以及链式访问)

从最浅层剖析C语言————第六节(深入了解数组传参、嵌套调用以及链式访问)

时间:2024-12-08 12:31:43浏览次数:12  
标签:传参 arr return 函数 形参 int C语言 嵌套 数组

目录

 

1. 前情提要

2. return语句

3. 数组作为函数参数

4.嵌套调用和链式访问

4.1 函数的嵌套调用

4.2 链式访问


 

1. 前情提要

前面我们讲到了函数里面的形参和实参的概念,形参顾名思义就是一个形式上的参数,不参与实际的运算,而实参则刚好相反

但是实参是需要传递给形参的,他们两个之间是存在联系的

但是形参和实参又都是各自独立的内存空间,我们接下来就用监视窗口来观察一下形参和实参分别占据的地址

3bc9ab5314b347438c095807dde1c4c9.png

5bcba1b9d3e045df8237da0c0b3c53cd.png

从上面的监视窗口可以看到,在我们执行完了整个函数的情况下,a,b里面的值的确传给了x,y

但是,a,b的地址与x,y是不相同的

2. return语句

我们在第一次写C语言程序的时候,main函数的结尾就需要写上一个return 0;

那return的作用到底是什么呢?

·return后面可以是一个数值,也可以是一个表达式,如果是表达式的话就优先执行表达式

·return后面同样可以什么都没有,直接写一个return,这种写法就适用于那些函数返回类型为void的情况

·一旦return后面返回的类型与函数本身返回类型是不一样的,那么系统将会自动的将你的返回值转换为函数的返回类型

·return语句执行完毕之后,函数就会彻底返回,后面的代码不会继续执行

·如果函数里面存在if等分支语句的情况下,则需要保证每一种情况下都有return返回,否则将会出现编译错误

3. 数组作为函数参数

在我们后面需要在各种函数问题当中,经常会遇到需要将数组作为参数传递给函数的情况,从而实现在函数内部对于数组进行操作

但我们要如何进行数组传参呢?

我们在之前学习数组的内容的时候就知道,数组里面是可以储存很多个元素的(元素类型必须保证要相同)

那我们想要将数组传递过去,也就是等同于将数组里面的每一个元素都传递过去

能实现这个功能的第一步就是需要获取到数组里面的每一个元素,这个操作我们一般称为遍历数组

而访问数组里面的很多个元素,就需要用到for循环来首先生成数组里面的各个元素的下标,有了下标,我们再去利用下标访问操作符来进行访问就可以了

932cfe7dce0d42699ec38c6887165ecb.png

值得注意的是,比如要计算数组里面的元素个数的多少,我们可以用上面蓝笔标注出来的代码来进行实现

在这里强调几个数组传参的重要知识

·函数的形式参数要与函数里面的实际参数个数保持相同

·函数的实参是数组,形参也可以写成是数组的形式

·当函数的形参是一维数组的时候,数组的大小可以省略不写,如上面只写了arr[ ],

·当函数的形参是二维数组的时候,数组的行可以省略,但是列不能省略

·数组传参的时候,形参是不会创建新的数组

·所以形参所操作的数组与实参是同一个数组,这一点与传元素过去有所区别

4.嵌套调用和链式访问

4.1 函数的嵌套调用

嵌套调用实际上就是函数的互相调用,一个函数的内部调用会调用另一个函数,正因为函数之间有效的相互调用,最后才能写出来相对大型的程序

接下来我们便写出一个选择排序的代码

//简单的选择排序
#include<stdio.h>
void swap(int* a, int* b)
{
	int temp = *a;
	*a = *b;
	*b = temp;
}
void Selection_sort(int arr[], int sz)
{
	int i,min,j;
	for (i = 0; i < sz; i++)
	{
		min = i;
		for (j = i + 1; j < sz; j++)
		{
			if (arr[j] < arr[min])
			{
				min = j;
			}
		}
		swap(&arr[i], &arr[min]);
	}
}
void print_arr(int arr[], int sz)
{
	int i;
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
}
int main()
{
	int arr[10] = { 10,9,8,7,6,5,4,3,2,1 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	Selection_sort(arr, sz);
	print_arr(arr, sz);
	return 0;

这个代码的Selection_sort里面就调用了另一个swap函数,每一个函数都具有一个独立的功能,之后很多很长的代码实际上都是函数之间的嵌套调用,但是函数是不能被嵌套定义的

4.2 链式访问

链式访问,实际上就是将一个函数的返回值作为另一个函数的参数,像链条一样将函数串起来就是函数的链式访问

688577afaff6414f9b0bece26aa78d0d.png

就像上图的代码一样,将strlen的返回值作为printf函数的参数,这就是一个很简洁的关于函数的链式访问的示例

接下来我们再看一个非常有趣的代码,学会了可以拿这个代码去考你的舍友和老师哦~

6666a2f5c91d42fc881aab432462fe39.png

思考一下,这个代码最后的输出结果会是什么呢?

关键就在于要弄明白printf函数的返回值是什么

其实学到现在,大部分同学可能都没想到printf这个经常使用的函数竟然还会有返回值呢?!

遇函数不知,cplusplus.com网站会给出答案

在大家的学习过程中,遇到有函数不认识或者不了解的,都可以去上面这个网站完整的了解这个函数,只有真正完全了解一个函数,我们之后才能更加熟练的去使用这个函数,也能在之后根据这个函数的底层逻辑去写出更好的函数

8277241e4a6d48079e4d1c75e74b05d1.png

printf的返回值就是打印在屏幕上字符的个数注意:是打印出字符的个数

那么上面那个代码,第三个printf打印43,所以返回值是2,第二个printf打印2,所以返回值是1,第一个printf最后就打印了一个1

所以最后屏幕上会打印出4321,正如下图所示

941522d1e5af47fab62146dc25d149df.png

 

标签:传参,arr,return,函数,形参,int,C语言,嵌套,数组
From: https://blog.csdn.net/derive_magic/article/details/142317862

相关文章

  • 字符转换pta(C语言)
    本题要求提取一个字符串中的所有数字字符('0'……'9'),将其转换为一个整数输出。输入格式:输入在一行中给出一个不超过80个字符且以回车结束的字符串。输出格式:在一行中输出转换后的整数。题目保证输出不超过长整型范围。输入样例:free82jeep5输出样例:825代码:#include<st......
  • 字符串替换pta(C语言)
    本题要求编写程序,将给定字符串中的大写英文字母按以下对应规则替换:原字母对应字母AZBYCXDW……XCYBZA输入格式:输入在一行中给出一个不超过80个字符、并以回车结束的字符串。输出格式:输出在一行中给出替换完成后的字符串。输入样例:Onlythe11CAPItaLLeTtERSarerepla......
  • 【C语言--趣味游戏系列】--电脑关机整蛊小游戏
    前言:老铁们,还是那句话,学习很苦游戏来补,为了提高大家与朋友之间的友谊,博主在这里分享一个电脑关机的恶作剧小游戏,快拿去试试吧!!!目录:1.电脑关机代码2.详解1.电脑关机代码#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<stdlib.h>#include<string.h>......
  • p标签里面嵌套img标签会出现向上高3像素是什么原因?如何处理?
    img元素默认是inline元素,与文本的基线对齐。而p元素内部的文本也与基线对齐。img元素底部会有几像素的空白,这是由于img的默认vertical-align属性值为baseline造成的。这个空白通常表现为向上偏移3px左右,但具体数值取决于字体大小、行高以及图片的底部边缘形状。解......
  • c语言实现二叉树的创建、遍历(先序、中序、后序)
    二叉树是一种树形数据结构,其中每个节点最多有两个子节点,通常称为左子节点和右子节点。二叉树在计算机科学中具有广泛的应用,如表达式解析、数据存储与检索等。以下是有关二叉树的基本知识。1.二叉树的基本定义节点:二叉树的基本组成单元,包括节点值和指向其子节点的指针(左指......
  • C语言经典代码——part 23
    【程序84】题目:一个偶数总能表示为两个素数之和。1.程序分析:2.程序源代码:#include"stdio.h"#include"math.h"main(){inta,b,c,d;scanf("%d",&a);for(b=3;b<=a/2;b+=2){for(c=2;c<=sqrt(b);c++)if(b%c==0)break;if(c>sqrt(b))d=a-b;elsebr......
  • C语言编程实践:自制猜数字小游戏
    一、引言今天分享一个最近编写的猜数字游戏。游戏的要求:1、是电脑自动生成1-100的随机数。2、玩家猜数字,猜数字过程中提示猜大了或者猜小了,提示玩家猜出结果,并限制一定的次数,提高小游戏体验感。二、随机数的生成C语言提供了一个函数叫做rand,这函数是可以生成随机数的,函数......
  • C语言实现三子棋
    //创建test.c文件//三子棋#define_CRT_SECURE_NO_WARNINGS1#include"game.h"//头文件引用voidmenu(){ printf("******************\n"); printf("***1.play***\n"); printf("***0.exit***\n"); printf("*****......
  • 【C语言】--关于数组的一系列问题,看这篇就够了
    前言:在C语言中,数组是一种极为重要的数据结构,它为储存和处理多个相同类型的数据元素提供了便携而高效的方式。无论是处理简单的数值序列还是复杂的数据集合,数组都扮演着不可或缺的角色。下面,就跟博主一起来看看数组的一系列问题吧!文章目录:1.数组是什么?2.一维数组2.1......
  • 最大值,最小值,平均值(C语言)
    今天来做一道比较经典的题目求最大值,最小值和平均值,常用于信息统计;以成绩为例:输入n科成绩(浮点数表示),统计其中的最高分,最低分以及平均分。数据范围:1≤n≤100 1≤n≤100  ,成绩使用百分制且不可能出现负数一般要用到数组,选择和循环语句原理:数组存储数据通过循环遍历数......