作者介绍:友友们好我是沐曦希,可以叫我小沐💕
作者主页:沐曦希的个人博客主页.🎉
作者的gitee:https://gitee.com/muxi-c-language
C语言系列文章:
🎈 1. 函数零基础使用大全,助你了解函数(一)
🎈2. 循环语句这些这些知识点你真的会了吗?(2)
🎈3. 循环语句这些知识点你真的会了吗?(1)
🎈4.分支语句你会了吗?
🎉小沐和友友们一样喜欢编辑,天天敲代码🤭,沉迷学习,日渐消瘦。很荣幸能向大家分享我的所学,和大家一起进步,成为合格的卷王。✨如果文章有错误,欢迎在评论区✏️指正。那么开始今天的学习吧!😘
文章目录
1.前言
前面小沐写了C语言中函数是什么,怎么定义的,分类等等 函数零基础使用大全,助你了解函数(一),那么今天开始学习函数的调用,函数的嵌套调用和链式访问和函数的声明和定义。😘
2.函数的调用
函数调用的一般格式为:函数名 (实参列表)
按函数在语句中的作用,可分为函数语句,函数表达式和函数参数。
在一个函数中调用另一个函数需要具备条件:
(1) 首先被调用的函数必须是已经存在的函数。
(2) 如果使用库函数,应用#include命令将有关头文件“包含”到文本件中来。
(3) 如果使用用户自定义的函数,函数调用遵循先定义、后调用的原则。
注:
(1) 被调函数应出现在主调函数之前;
(2)如果被调用函数出现在主调函数之后,则函数必须在主调函数之前声明
函数的调用概述图:
函数的调用分为传值调用和传址调用。
2.1.传值调用
函数的形参和实参分别占有不同内存块,对形参的修改不会影响实参。
传值调用将实参的数据(而不是地址)传给了形参,在被调用的函数中,形参值改变了,但是不影响主调函数的实参值。
参数传递方向是由实参向形参单向传递,函数的嵌套调用和链式访问
例如:
#include<stdio.h>
int Add(int x, int y)
{
return x + y;
}
int main()
{
int a = 10;
int b = 20;
int sum = Add(a ,b);
printf("%d", sum);
return 0;
}
2.2.传址调用
传址调用与传值调用不同,传址调用是将实参变量的地址传给形参,✏️(此时形参是指针,即让形参的指针指向实参地址)
改变形参的同时也把实参改变了。
例如:
#include<stdio.h>
int Swap(int* x,int* y)
{
int z = *x;
*x = *y;
*y = z;
return 0;
}
int main()
{
int a = 10;
int b = 20;
printf("%d %d\n", a, b);//交换前
Swap(&a, &b);
printf("%d %d", a, b);//交换后
return 0;
}
传址调用是把函数外部创建变量的内存地址传递给函数参数的一种调用函数的方式。
这种传参方式可以让函数和函数外边的变量建立起真正的联系,也就是函数内部可以直接操作函数外部的变量。
2.3 练习
1.写一个函数,实现一个整形有序数组的二分查找。
我的二分查找法.有详细解答。
代码实现:
int bin_search(int arr[], int left, int right, int key)
{
int mid = 0;
while(left<=right)
{
mid = (left+right)>>1;
if(arr[mid]>key)
{
right = mid-1;
}
else if(arr[mid] < key)
{
left = mid+1;
}
else
return mid;//找到了,返回下标
}
3.函数的嵌套调用和链式访问
函数是有一定结构的整体,可以嵌套调用即一个函数里面可以包含函数,即函数的嵌套调用,但是要注意的是不能在一个函数里面定义一个函数。✏️也可以进行函数的链式访问。
3.1.嵌套调用
#include <stdio.h>
void new_line()
{
printf("hehe\n");
}
void three_line()
{
int i = 0;
for (i = 0; i < 3; i++)
{
new_line();
}
}
int main()
{
three_line();
return 0;
}
3.2.链式访问
把一个函数的返回值作为另外一个函数的参数。✏️
#include <stdio.h>
#include <string.h>
int main()
{
char arr[20] = "hello";
int ret = strlen(strcat(arr, "bit"));//strcat是讲两个char类型连接起来
printf("%d\n", ret);
return 0;
}
注:printf函数的返回值是打印在屏幕上字符的个数
举个栗子:
#include <stdio.h>
int main()
{
printf("%d", printf("%d", printf("%d", 43)));
//结果是啥?
return 0;
}
4.函数的声明和定义
“函数定义”是指对函数功能的确立,包括指定函数名,函数值类型、形参类型、函数体等,它是一个完整的、独立的函数单位。而“函数声明”的作用则是把函数的名字、函数类型以及形参类型、个数和顺序通知编译系统,以便在调用该函数时系统按此进行对照检查(例如函数名是否正确,实参与形参的类型和个数是否一致)。
在书写形式上,函数声明可以把函数头部复制过来,在后面加一个分号;而且在参数表中可以只写各个参数的类型名,而不必写参数名。
4.1.函数声明
- 告诉编译器有一个函数叫什么,参数是什么,返回类型是什么。但是具体是不是存在,函数声明决定不了。
- 函数的声明一般出现在函数的使用之前。要满足先声明后使用。
- 函数的声明一般要放在头文件中的。
#include<stdio.h>
int Add(int, int);//int Add(int x, int y);//函数的声明
int main()
{
int a = 0;
int b = 0;
int c = Add(a, b);
return 0;
}
4.2.函数定义
函数的定义是指函数的具体实现,交待函数的功能实现。
#include<stdio.h>
int Add(int x, int y)
{
return x + y;
}//函数的定义
int main()
{
int a = 10;
int b = 20;
int c = Add(a, b);
printf("%d", c);
return 0;
}
函数的声明一般放在头文件.h上,而函数的定义放在源文件.c上。即
自己写的头文件一个用双引号即“”括起来,即#include"stdio.h"。库函数中的头文件用<>括起来,即#include<stdio.h>。
5.写在最后
那么今天的学习就到这里了。友友们觉得不错的可以给个关注,点赞或者收藏哦!😘感谢各位友友们的支持。以下的代码希望各位大佬们自行检验哦,毕竟亲手操作让记忆更加深刻。
你的❤️点赞是我创作的动力的源泉
你的✨收藏是我奋斗的方向
你的🙌关注是对我最大的支持
你的✏️评论是我前进的明灯
创作不易,希望大佬你支持一下小沐吧😘
下一期见了!