C中函数的基本用法

函数:(顾名思义,就是为了实现某一功能的一个功能选项。)函数是一个完成特定功能的代码模块,其程序代码独立,通常要求有返回值,也可以是空值。
函数的一般形式:
<1><数据类型><2><函数名称>(<3><形式参数说明>){
语句序列;
return[(<4><表达式>)];
}
函数调用时形式:
函数名称(<5><实际参数>)
注意几点:

  1. 函数的返回值类型与函数声明时的数据类型时相同的。
  2. 形式参数就是在定义函数时的参数表,它只是定义了调用时参数的个数,类型,以及函数内部用来引用的名字,并没有具体的内容。形参未被调用时不占存储单元。形参只在调用过程中占有存储单元。
  3. 实际参数就是在使用函数时,调用函数传递给被调用函数的数据。需要确切的数据。并且占有存储 单元。
  4. <形式参数说明>变量的名称可以缺省,但是类型不可以缺省。eg:double Pt(double,float); //这种格式也是正确的。
  5. 在写函数时,可以把无内容的空函数写在main函数最前边,然后在main函数的后边进行函数的详细说明,这种方式看起来舒服,符合编程规范。
  6. 还有头文件的作用以及用法详见[CSDN lm_y(https://blog.csdn.net/Com_ma/article/details/78546807)

编程实现x^n这一功能函数。其中x为实数,n为正整数。
代码如下:

#include <stdio.h>
#include <stdlib.h>
double qm(double a,int b){
double c=1;
int i;
for(i=1;i<=b;i++){
c*=a;
}
return c;
}
int main(int argc, char *argv[]) {

double x;
int b;
printf(“请输入一个实数x=”);
scanf("%lf",&x);
printf(“请输入一个正整数b=”);
scanf("%d",&b);
printf("\n");
double sum;
sum=qm(x,b);
printf(“x^b的值为:%lf”,sum);
return 0;
}
运行结果如上
刚开始因为函数写在了main()当中找了很久错误,所以一定要谨慎编程!
函数的传参问题

函数之间的参数传递方式:

  • 全局变量
  • 复制传递方式
  • 地址传递方式

全局变量:就是在函数体外边说明的变量,他们在程序中的每个函数当中都是可见的。(全局变量一经定义后在程序的任意地方可见。函数的调用位置不同,程序的执行结果可能受到影响。不建议使用)
复制传递方式:1>调用函数将实参传递给被调用的函数,被调用函数将创建同类型的形参并用实参初始化。2>形参是新开辟的存储空间,在形参中改变函数的值,不会影响到实参。
地址传递方式:1>按地址传递,实参为变量的地址,形参为同类型的指针。2>被调用函数中对形参的操作,将直接改变实参的值(被调用函数对指针的目标操作,相当于对实参本身的操作)

复制传递方式:(代码如下)
问题一:实现两个数据的交换;
void exchange(int*,int*);
int main(int argc, char *argv[]) {
int a=10;
int b=20;
printf(“before:%d %d\n”,a,b);
int *r;
int *t;
r=&a;
t=&b;
exchange(r,t);

printf(“after:%d %d\n”,a,b);
return 0;
}
void exchange(int* c,int* d){
int f;
f=*c;
*c=*d;
*d=f;
}

运行结果如上
总结:如果交换函数中不用指针地址直接进行数据的交换,发现数据依旧是30,40;没有进行交换。这是因为exchange函数中有自己的地址空间,此地址空间与main函数中的地址空间完全不同。数据在exchange()函数中实现了地址中数据的交换,但是在main函数中调用exchange函数,main函数中参数的地址没有因为形参中地址中数据交换变化而变化,原来的地址依旧存储着原来的数据。
所以可以运用指针传递方式,如上边代码。

如何通过函数对数组进行操作;
问题二:编写一个函数,统计字符串中大小写字母的个数,并把字符串中的小写字母 转化成大写字母。
int tongji(char *);
int main(int argc, char *argv[]) {
char sh[]=“adGUljHK KSDvds”;
int a;
printf(“输出大小写反转后的字符串: %s\n”,sh);
a=tongji(sh);
printf(“输出字符串中所有的大小写字母的个数:%d\n”,a);
printf(“输出大小写反转后的字符串: %s”,sh);
return 0;
}
int tongji(char *p){
int sum_1=0;
int sum_2=0;
int sum=0;
while(*p !=’\0’){
if(*p>=97 && *p<=122){
sum_1++;
*p-=32;
}else if(*p>=65 && *p<=90){
sum_2++;
*p+=32;
}
sum=sum_1+sum_2;
p++;
}
return sum;
}
运行结果如上
复制传递和地址传递方式的区别:如果是复制传递,我们仅仅把值取了过来,我们开辟了新的地址空间,我们无法改变实参,若需要改动实参,必须的通过穿指针。
怎样实现地址传递方式也不能改变实参:合理运用const,如果const放在形参的指针前边,实参中地址里的数据是不可以改变的。
数组在函数中传参问题。
复制传递方式:实参为数组的指针,形参为数组名(数组名本质也是一个指针变量)
地址传递方式:实参为数组的指针,形参为同类型的指针变量。
如何通过函数运用多指针问题;
问题三:实现字符串去除空格;
错误代码:
delet_k(char *,int n);
int main(int argc, char *argv[]) {
int s[]=“sd fh ks d”;
int n=sizeof(s)/sizeof(int);
printf(“输出删除空格前的字符串:%s\n”,s);
delete_k(s);
printf(“输出删除空格后的字符串:%s\n”,s);
return 0;
}
void delet_k(char *a,int n){
char *b;
b=a;
int i=0;
for (i=0;i<n;i++){
if(*a[i]=’ ‘){
a++;
}else {
while(*a==’ '){
a++;
}
}
(不完整)
错误原因:目的是通过两个指针,一个无论空格与否都后移,一个指针遇到空格停止,然后把移动快的指针存储的数据存入移动慢的指针中,但是后边通过各种语句实现都达不到效果,而且特别混乱。。
以上错误代码纠正:

void delet_k(char *a,int n){
char *b;
b=a;
int i=0;
for (i=0;i<n;i++){
if(*a==’ ‘){
a++;
}else {
*b=*a;
b++;
a++;
}
}
*b=’\0’;
}

简洁后代码:
void delet_k(char *);
int main(int argc, char *argv[]) {

char s[]=“sd fh ks d”;
printf(“输出删除空格前的字符串:%s\n”,s);
delet_k(s);
printf(“输出删除空格后的字符串:%s\n”,s);
return 0;
}
void delet_k(char *a){
char *b;
b=a;
while(*a){
if(*a==’ ‘){
a++;
}else{
*b=*a;
b++;
a++;
}
}
*b=’\0’; //因为字符串的最后一位是\0;
}
运行后代码如上

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值