函数:将代码块封装成一个个不同的函数,在使用时可以多次的调用,不需要关心内部的实现;
#include <stdio.h>
void MyPrint()
{
printf("&&&&&&&&&&&\n");
printf("Hello\n");
printf("World\n");
printf("&&&&&&&&&&&\n");
}
int main()
{
MyPrint();
MyPrint();
}
一个函数,在程序中可以随意调用;
函数的定义:
返回值类型 函数名(参数列表) {函数体}
当将函数的定义放在Main函数下面的时候,会报错;因为程序的编译是从上到下执行的,先编译Main的时候,还没有定义函数MyPrint,所以在编译过程中就会找不到这个函数;函数要先定义在使用;
但是可以在使用之前先声明有这个函数;
#include <stdio.h>
void MyPrint(); //函数声明
int main()
{
MyPrint();
printf("\n");
MyPrint();
printf("\n");
}
void MyPrint()
{
printf("&&&&&&&&&&&\n");
printf("Hello\n");
printf("World\n");
printf("&&&&&&&&&&&");
}
函数声明的时候,必须和定义的函数保持一致;
#include <stdio.h>
int GetNumber();
int main()
{
int number = GetNumber();
printf("%d", number);
}
int GetNumber()
{
return 888;
}
有返回值的函数,调用GetNumber时,return 返回888;
没有返回值时,返回值类型是void;
#include <stdio.h>
int Add(int a,int b);
int main()
{
int number = Add(3,6);
printf("%d", number);
}
int Add(int a, int b)
{
return a + b;
}
带参函数,传递的参数个数和类型必须保持一致;
将3和6传递给函数Add,返回3+6的结果,赋值给number;
#include <stdio.h>
void Swap(int a,int b);
int main()
{
int a = 3, b = 6;
Swap(a,b);
printf("a=%d,b=%d\n", a, b);
}
void Swap(int a, int b)
{
int temp = a;
a = b;
b = temp;
}
Swap函数,将两个数调换位置,执行后a和b的值其实没有被调换;
实参和形参:调用函数时给的参数时实参,调用的函数在执行时的使用参数是形参;
调用者传递的参数和被调用者使用的参数,并不在同一个地址里;
#include <stdio.h>
void Swap(int *a,int *b);
int main()
{
int a = 3, b = 6;
Swap(&a, &b);
printf("a=%d,b=%d\n", a, b);
}
void Swap(int *a, int *b)
{
int temp = *a;
*a = *b;
*b = temp;
}
想对实参进行修改,就要传递地址,这里需要使用指针,调用者将它实参的地址传递给被调用者的形参,那么被调用者在使用形参的时候,是对实参的地址中的内容进行修改;
#include <stdio.h>
void Sq(int a[5]);
int main()
{
int a[] = { 1,2,3,4,5 };
Sq(a);
for (int i = 0; i < 5; i++)
{
printf("%d\n", a[i]);
}
}
void Sq(int a[5])
{
for (int i = 0; i < 5; i++)
{
a[i] = a[i] * a[i];
}
}
当数组作为函数的参数时,是传递的数组的首地址;所以在被调用者内部修改时,也是直接修改该地址中的值;