下面是一个 求两个整型变量之和的函数
函数运算完是返回一个整型值 所以函数的类型为 int
使用函数时要先声明
#include
/*
函数怎么写?
返回值类型 函数名 (参数)
返回值类型一定要写 不确定或者没有返回值可以写 void
例如 void add(int a,int b)
参数列表可要可不要 也可以写不同变量 可以写void 也可以不写
{
函数内容;
}
*/
int add(); //声明函数 方法一
//int add(int,int); 声明函数 方法二
//int add(int a,int b); 声明函数 方法三
int main(void)
{
int x = 25,y = 15;
int num = 0;
num = add(x,y);
printf("x + y = %d\n",num);
return 0;
}
int add(int a,int b) // 函数头 声明函数时可以直接复制 这段 加个分号;
{
a = a + b ;
return (a); //返回值 也可以去掉括号 return a;
}
这里有实参与形参的概念
实参就是实际的参数
形参就是形式上的参数
一般来说 像上一篇代码 main函数为主函数 而 add()为子函数 主函数的是实参 子函数的是形参
形参只是实参的一个副本 无论形参怎么变 不会影响实参的数值。
但是如果为指针类型的函数呢?
实参将一个存放着数据的地址传给形参
而在子函数中如果改变了形参的地址上的变量 就会等同于影响了实参的地址上的变量
因为地址是一样的
#include
//声明函数
char cha(char *);
char cha1(char *);
int main(void)
{
char ch[5] = {'a','b','c','d','e'}; //定义一个含有五个元素的一维数组
char *ch_p = NULL; //指针指向空地址 以防野指针出现
ch_p = ch; //将指针指向ch字符数组的首元素地址
char ch_1,ch_2; //定义两个char变量 接受函数的char返回值
ch_1 = cha(ch);
ch_2 = cha1(ch);
printf("cha = %c \n",ch_1);
printf("cha1 = %c \n",ch_2);
printf("\n");
return 0;
}
//因为main函数的实参传的是地址,所以形参接受的地址上保存着同一个数据 。
char cha(char *ch)
{
return ch[3]; // 输出第四个字符
}
char cha1(char ch[5])
{
//不建议弄这个定义 因为从内存的角度设置的变量越少越好
/*
char c = 0;
c = ch[3];
*/
return *(ch + 2); // 输出第三个字符
}
函数只能返回一个值
如果想经过函数从而得到多个值
有两个方法
一个是将变量设置为全局变量 ,但是由于全局变量可以在所有函数中都可以使用,从而其值的变化不确定,所以要慎用。
一个是设置一个数组进行储存 返回值设为一个数组
题目为输入一个字符串 ,通过实参传入子函数 统计出字符串的字母 数字 空格 其他字符的个数 并在主函数打印出来
#include
int *look_up (char *,int,int *); //声明函数
int main(void)
{
unsigned int len;
char ch[200] = {0}; //定义一个一维字符数组,数组内包含着200个字符元素
int num_sz[4] = {0}; //定义一个一维整型数组,数组内包含4个整型元素
int num_ch,num_in,num_kong,num_other;//定义 字符个数 数字个数 空格个数 其他字符个数
printf("请输入一串字符:\n");
fgets(ch,200,stdin);
len = strlen(ch);
printf("你输入的字符串为 : \n%s\n",ch);
look_up(ch,len,num_sz);
printf(" 字母一共有 = %d\n 数字一共有 = %d\n 空格一共有 = %d\n 其他字符一共有 = %d\n ",num_sz[0],num_sz[1],num_sz[2],num_sz[3]);
return 0;
}
int *look_up(char *ch,int len,int *num_sz)
{
int num_ch = 0,num_in = 0,num_kong = 0,num_other = -1;
//其他字符 -1 的原因是要把回车给去掉
int i = 0;
for(i = 0 ; i