c学习笔记(6)--函数

        在我们使用大段单独功能代码的时候,放在主函数里面就总是会显得十分繁杂,这时候单独把这个代码封装出来,单独设在外面的位置,这个就是函数,在程序中;函数就是封装了一段流程结构的代码,是一种重构的技术手段。

*****************************************************

函数的第一种,结构,函数在主函数前面:

#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>
#include "test.h"
并且要在主函数那里,标一下头文件的定义,这样系统在使用的时候就会去对应的位置进行查找
#---------前文说过这个表示寻找什么什么文件
<>--------这个符号表示这个东西是系统本身有的
""---------这个则表示这个定义的头文件,是我们自己创建的,用这俩个符号加以区分,能够很直接的进行说明
**************************** 
全局变量
在函数以及主函数外部的定义一个变量,就叫做全局变量,这个变量,在全局中当没有其他定义的时候,都可以进行使用,在程序创建的过程时候,就创建,当程序结束的时候,才会结束这个变量
局部变量
在函数中使用的变量,只要是在{}内部的变量,就都是局部变量,当在{}这个使用的时候,局部变量就会被生成,同样当{}这个结束的时候,也就会使局部变量消失
#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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值