在我们使用大段单独功能代码的时候,放在主函数里面就总是会显得十分繁杂,这时候单独把这个代码封装出来,单独设在外面的位置,这个就是函数,在程序中;函数就是封装了一段流程结构的代码,是一种重构的技术手段。
*****************************************************
函数的第一种,结构,函数在主函数前面:
#include <stdio.h>
int hanshu(int a)------int a 指的是一个形参,里面是多种形式的
{
*****
}
int main()
{
hanshu();----------记住,当遇见()了,就表明是在调用这个函数
}
第二种结构体,当函数在主函数后面的时候,因为c语言中,代码的顺序都是从上往下读的,当他看到主函数中的函数调用时候,不知道他是什么,所以,在最开始的时候,就要对函数进行一下,声明定义:
#include <stdio.h>
int hanshu(int a);--------定义之前,要加一个函数的声明,后面要有括号
int main()
{
hanshu(a);-------此时已经有声明了,系统知道hanshu这个代表的是一个函数,就会去下面找关于这个函数的定义
}
int hanshu()-----函数的定义
{
*****
}
*********************************************************8
对于函数里面的参数,对于函数来说,调用里面的参数并不会更改其实际的值,函数的调用,只是相当于参数给复制过来了,那么如果要是我们想要将函数中的值改变并且也想影响到主函数中的实际值,这就需要对其地址进行操作,每一个数据的地址是固定的,更改地址的内容,就是对变量进行了更改
#include <stdio.h>
void exchange(int a,int b);
void exchange1(int *a,int *b)
int main()
{
int a=3;
int b=4;
exchange(a,b);------没有进行数据的替换,输出还是a=3,b=4
exchange1(&a,&b);--------运用了地址,对地址上的数据进行了更改,更改了数据的本身,a=4,b=3
}
void exchange(int a,int b)
{
int i;
i=a;
a=b;
b=i;
return 0;
}
void exchange(int* a,int *b)
{
int i;
i=*a;
*a=*b;
*b=i;
return 0;
}
******************************************************************
当函数中的参数包括数组的时候,也需要注意,因为数组不能传入函数的参数当中,当一个数组当作参数的时候,只是代表这个数组的首地址,因此,我们可以换一种方法,当我们传入一个地址的首地址,在加上他的长度,那不就是这个数组了嘛
#include <stdio.h>
int add_all(int a[],int len );
int main()
{
int b[] = { 1,2,3,45,6, };
len=sizeof(b)/sizeof(b[0]);
int c=add_all(b,len)----------------求得了,这个数组的总值,因为函数返回值是int类型,所以要有一个变量值接受
}
int add_all(int a[],int len )
{
int sum=0;
int i;
for(i=0;i<len;i++)
{
sum+=a[i];
}
return sum;
}
*******
自定义头文件,可以增加一头文件,将函数的声明都放在那个自创的头文件中,这样会使程序更加的简洁,明了。
#include <stdio.h>
int i = 3;
void fun41()
{
printf("函数内部%d\n", i);-------此时的i使用的是外部的i=3
static int c;------static-----表示的静态变量
int i;-------定义了一个局部变量,只是与全局变量同名字,并不是一个
i=10;--------赋值为10
i++;------运用的是局部变量
c++;
printf("c=%d,i=%d\n",c,i);
}
int main()
{
fun41();
fun41();
printf("主函数%d\n", i);------在这里使用的是i的全局变量
return 0;
}
static--------理解为局部内的 唯一变量 相当于全局,但全局不可访问
************************************************
#include <stdio.h>
#include <malloc.h>------要使用堆栈,必须使用的头文件
#include<string.h>
int* fun51()
{
int* p = (int*)malloc(sizeof(int));malloc返回值是void,因此需要类型强转
*p = 188;
}
int main51()
{
代码区code zone
常数区constant zone
全局变量区global zone
栈区stack zone ·
堆区heap zone */、
/*栈区*/
int* p = NULL;
p = fun51();
printf("%d", *p);只有第一个指针p会显示,其他的都不会显示,被释放了
printf("%d", *p);
printf("%d", *p);
printf("%d", *p);
/*堆区*/
int n = 8;
int* parr = (int *)calloc(n, sizeof(int));在堆栈去分配n个int空间
int* pt;
int i;
for ( i = 0;i < n; i++)
{
parr[i];
}
realloc(parr, sizeof(int) * 4);重新开辟一个空间
pt = (int*)calloc(n + 4, sizeof(int));在parr后面扩展4个字节空间
memcpy(pt, parr, n * sizeof(int));从parr中复制n个字节到pt中
free(parr);
parr = pt;
for(;i<n+4;i++)
{
parr[i]=i+1;
}
return 0;
}