C语言——函数(下)访问、声明、定义

简介: C语言——函数(下)访问、声明、定义

前言

前面我们已经介绍了函数的分类、参数、调用,那么这次我们紧接着上节课的内容再了解一下函数的、访问、声明和定义。

1.函数的嵌套调用和来链式访问

函数和函数之间可以根据实际的需求进行组合的,也就是互相调用的。

1.1嵌套调用

当我们要打印一个”hehe“的时候可以这样写

#include<stdio.h>
void new_line()
{
  printf("hehe\n");
}
int main()
{
  new_line();
  return 0;
}

那如果我们要打印三个”hehe“呢,该如何实现,下面我们来试着写写看>

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;
}


82e24d4429b947b7893fe380a7cf873b.png


three_line函数中调用了new_line,main函数中又调用了three_line函数,由此可以看出来函数是可以嵌套调用的但是不可以嵌套定义!

1.2链式访问

把一个函数的返回值作为另外一个函数的参数。

我们来举个例子演示一下>

int main()
{
  printf("%d\n", strlen("abcdef"));
  //将strlen的结果以整型形式打印
  return 0;
}


strlen函数的返回值传给printf函数进行打印,这就是函数的链式访问。

再来看这个代码>

int main()
{
  printf("%d", printf("%d", printf("%d", 43)));
  //p1            p2            p3
  return 0;
}在这里插入代码片


这个代码又会输出什么呢?

我们来分析一下:

首先是p1,p1想要打印就要调用p2,p2打印的话就要调用p3,p3的打印结果很好看出来是43,p2打印的结果是什么呢?我们先分析p2打印的是p3函数的返回值,这样子有思路了,我们只需要知道printf函数的返回值就能知道p2打印的结果了,想知道printf的返回值是什么,我们就要用到上节课所提到的工具MSDN(上节课中有下载地址哦)。

我们在MSDN中搜索printf函数>


image.png

printf的返回值是int,下面返回值介绍


这些函数返回的是打印字符的个数,如果发生错误则返回负值。


了解了这些,我们就可以知道p2函数打印的内容是p3函数打印的字符数,p1函数打印的则是p2函数打印的字符个数,由此可以得出上面代码打印的结果是4321。

程序走起来我们来看一下结果>


6c1192b130304952b2e1ff0bf06fce32.png


6.函数的声明和定义

6.1函数声明:

  1. 告诉编译器有一个函数叫什么,参数是什么,返回类型是什么。但是具体是不是存在,函数
    声明决定不了。
  2. 函数的声明一般出现在函数的使用之前。要满足先声明后使用。
  3. 函数的声明一般要放在头文件中的。


当我们写出这样的代码的时候

int main()
{
  int a = 0;
  int b = 0;
  scanf("%d %d", &a, &b);
  //求和
  int ret = Add(a, b);
  printf("%d\n", ret);
  return 0;
}
int Add(int x, int y)
{
  return x + y;
}


我们编译一下会发现,有警告⚠

886a7059ada74745884f94663c195163.png


”Add“函数未定义,这是为什么呢?

举个例子:我们平时看书的时候都是一行一行看从上往下看,那么计算机扫描代码也是相同的道理,当扫描到int ret = Add(a, b);,就会报警告说明Add函数未定义,扫描到int Add(int x, int y)时才发现Add函数,但是警告⚠已经报了。

那我们该怎么消除警告呢?

接下来就要用到我们的函数声明了,在main函数前面加上一个int Add(int x, int y);,则表示函数的声明,这是后来编译代码,就不会报出警告了。就相当于告诉计算机,我们有int Add(int x, int y)这么一个函数,再扫描到的时候就不会报出警报了。


2.2函数的定义:

函数的定义是指函数的具体实现,交待函数的功能实现。

Add.h的内容

放置函数的声明

#ifndef __TEST_H__
#define __TEST_H__
#include<stido.h>
//函数的声明
int Add(int x, int y);
#endif //__TEST_H__

test.c的内容

放置函数的实现

#include"Add.h"
int main()
{
  int a = 0;
  int b = 0;
  scanf("%d %d", &a, &b);
  //求和
  int ret = Add(a, b);
  printf("%d\n", ret);
  return 0;
}

772d0898d28b42d99f27460dabae46d7.png


这样写的话就要在test.c文件中包含头文件#include"Add.h"。


总结

以上就是函数访问、声明、定义的全部内容!有付出才会有收获,”种一棵树的最好时间是十年前,其次是现在。“创作不易,辛苦各位小伙伴们动动小手,三连一波~~~,本文中也有不足之处,欢迎各位随时私信点评指正!

相关文章
|
13天前
|
存储 网络协议 编译器
【C语言】深入解析C语言结构体:定义、声明与高级应用实践
通过根据需求合理选择结构体定义和声明的放置位置,并灵活结合动态内存分配、内存优化和数据结构设计,可以显著提高代码的可维护性和运行效率。在实际开发中,建议遵循以下原则: - **模块化设计**:尽可能封装实现细节,减少模块间的耦合。 - **内存管理**:明确动态分配与释放的责任,防止资源泄漏。 - **优化顺序**:合理排列结构体成员以减少内存占用。
77 14
|
17天前
|
存储 C语言 开发者
【C语言】字符串操作函数详解
这些字符串操作函数在C语言中提供了强大的功能,帮助开发者有效地处理字符串数据。通过对每个函数的详细讲解、示例代码和表格说明,可以更好地理解如何使用这些函数进行各种字符串操作。如果在实际编程中遇到特定的字符串处理需求,可以参考这些函数和示例,灵活运用。
39 10
|
17天前
|
存储 程序员 C语言
【C语言】文件操作函数详解
C语言提供了一组标准库函数来处理文件操作,这些函数定义在 `<stdio.h>` 头文件中。文件操作包括文件的打开、读写、关闭以及文件属性的查询等。以下是常用文件操作函数的详细讲解,包括函数原型、参数说明、返回值说明、示例代码和表格汇总。
41 9
|
17天前
|
存储 Unix Serverless
【C语言】常用函数汇总表
本文总结了C语言中常用的函数,涵盖输入/输出、字符串操作、内存管理、数学运算、时间处理、文件操作及布尔类型等多个方面。每类函数均以表格形式列出其功能和使用示例,便于快速查阅和学习。通过综合示例代码,展示了这些函数的实际应用,帮助读者更好地理解和掌握C语言的基本功能和标准库函数的使用方法。感谢阅读,希望对你有所帮助!
31 8
|
17天前
|
C语言 开发者
【C语言】数学函数详解
在C语言中,数学函数是由标准库 `math.h` 提供的。使用这些函数时,需要包含 `#include <math.h>` 头文件。以下是一些常用的数学函数的详细讲解,包括函数原型、参数说明、返回值说明以及示例代码和表格汇总。
40 6
|
17天前
|
存储 C语言
【C语言】输入/输出函数详解
在C语言中,输入/输出操作是通过标准库函数来实现的。这些函数分为两类:标准输入输出函数和文件输入输出函数。
101 6
|
17天前
|
存储 缓存 算法
【C语言】内存管理函数详细讲解
在C语言编程中,内存管理是至关重要的。动态内存分配函数允许程序在运行时请求和释放内存,这对于处理不确定大小的数据结构至关重要。以下是C语言内存管理函数的详细讲解,包括每个函数的功能、标准格式、示例代码、代码解释及其输出。
47 6
|
17天前
|
C语言
【C语言】全局搜索变量却找不到定义?原来是因为宏!
使用条件编译和 `extern` 来管理全局变量的定义和声明是一种有效的技术,但应谨慎使用。在可能的情况下,应该优先考虑使用局部变量、函数参数和返回值、静态变量或者更高级的封装技术(如结构体和类)来减少全局变量的使用。
31 5
|
17天前
|
C语言 开发者
【C语言】断言函数 -《深入解析C语言调试利器 !》
断言(assert)是一种调试工具,用于在程序运行时检查某些条件是否成立。如果条件不成立,断言会触发错误,并通常会终止程序的执行。断言有助于在开发和测试阶段捕捉逻辑错误。
27 5
|
18天前
|
编译器 C语言
【C语言】宏定义在 a.c 中定义,如何在 b.c 中使用?
通过将宏定义放在头文件 `macros.h` 中,并在多个源文件中包含该头文件,我们能够在多个文件中共享宏定义。这种方法不仅提高了代码的重用性和一致性,还简化了维护和管理工作。本文通过具体示例展示了如何定义和使用宏定义,帮助读者更好地理解和应用宏定义的机制。
37 2