4. 函数的调用
4.1 传值调用
函数的形参和实参分别占有不同内存块,对形参的修改不会影响实参。
例子
#include <stdio.h> void Swap1(int* px, int* py) { int* tmp = px; px = py; py = tmp; } int main() { int a = 10; int b = 20; int* p = &a; int* q = &b; printf("交换前:a=%d b=%d\n", a, b); Swap1(p,q); //该为传值调用,虽然该代码打不出效果 printf("交换后:a=%d b=%d\n", a, b); return 0; }
4.2 传址调用
传址调用是把函数外部创建变量的内存地址传递给函数参数的一种调用函数的方式。
这种传参方式可以让函数和函数外边的变量建立起真正的联系,也就是函数内部可以直接操
作函数外部的变量。
例子
#include <stdio.h> void Swap2(int* pa, int* pb) { int* tmp = *pa; *pa = *pb; *pb = tmp; } int main() { int a = 10; int b = 20; printf("交换前:a=%d b=%d\n", a, b); Swap2(&a, &b); //传址调用 printf("交换后:a=%d b=%d\n", a, b); return 0; }
5. 函数的嵌套调用和链式访问
函数和函数之间可以根据实际的需求进行组合的,也就是互相调用的。
5.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; }
函数可以嵌套调用,但是不能嵌套定义。
5.2 链式访问
把一个函数的返回值作为另外一个函数的参数。
#include <stdio.h> #include <string.h> int main() { //int len = strlen("abcdef");//这里介绍一下strlen函数 //printf("%d\n", len); //printf("%d\n", strlen("abcdef")); printf("%d", printf("%d", printf("%d", 54)));//结果为5421 return 0; }
6. 函数的声明和定义
6.1 函数声明:
告诉编译器有一个函数叫什么,参数是什么,返回类型是什么。但是具体是不是存在,函数
声明决定不了。
函数的声明一般出现在函数的使用之前。要满足先声明后使用。
函数的声明一般要放在头文件中的。
6.2 函数定义:
函数的定义是指函数的具体实现,交待函数的功能实现。
声明与定义的解释
在这里插入代码片int a;//变量的声明 int main() { printf("%d\n", a); return 0; } int a = 10;//定义 int a;//定义 int main() { printf("%d\n", a); return 0; } 变量还是函数都得满足先定义(声明)后使用 函数的声明 int Add(int x, int y); int main() { int a = 10; int b = 20; int c = Add(a, b); printf("%d\n", c); return 0; } //函数的定义 int Add(int x, int y) { return x + y; } 函数的定义 int Add(int x, int y) { return x + y; } int main() { int a = 10; int b = 20; int c = Add(a, b); printf("%d\n", c); return 0; } #include "add.h" #pragma comment(lib, "add.lib") int main() { int a = 10; int b = 20; int c = Add(a, b); printf("%d\n", c); return 0; }