C 语言教程 在线

1489C 函数

函数实现了代码的重用,大大简化缩短了程序员的工作量,更使得程序的可读性大大提高,函数的递归调用更是一种简化程序代码的方法;递归调用其实机是函数自己调用自己。

下面的实例是一个求1+2+3.....+n的递归实例:

#include <stdio.h>  //导如输入输出头文件

int sum(int n);//声明函数 
int main(){
    //主函数 
    int a=sum(4);
    printf("%d",a);
  return 0;
}
int sum(int n){
    //求和函数实现 
    //如果n为1,无需求和,直接返回1 
    if(n==1){
        return 1;
    }
    //如果n大于1,就返回n加上1+2+3.....+n-1的和 
    return n+sum(n-1);
}

可以发现,递归的代码很少,但是,递归也有缺点,递归占用的内存要比递推大,而且时间也要比递推长。

1488C 函数

函数声明和函数原型的参数名可以不一样,编译器他想知道的是函数参数的类型,与函数参数的名字没有关系,eg:

#
include<stdio.h>

int sum(int c,int d); // 函数声明

int main(int argc ,char*argv[])
{
   int a=2,b=3;
   printf("输出结果为: %d \n",sum(a,b));
   return 0;
}

int sum(int a,int b)
{
    return a+b ;
}

甚至函数声明可以写成:

int sum(int ,int );

编译器只要检查到函数返回类型,名称和参数类型正确即可。

1487C 函数

函数参数传递常用的三种方式

示例程序均以交换两个整数为例。

1. 值传递

#include <stdio.h>

void swap(int x, int y);
void swap(int x, int y)
{
    int temp;
    temp = x;
    x = y;
    y = temp;
}

int main( int argc, char *argv[] )
{
    int a = 5;
    int b = 10;
    swap(a, b); //调用交换函数
    printf("交换结果为 a = %d, b = %d\n",a,b);
    return 0;
}

由于值传递是单向传递,传递过程中只是改变了形参的数值,并未改变实参的数值,因此并不会改变a和b原有的值。

2. 指针传递

#include <stdio.h>

void swap(int *x, int *y);
void swap(int *x, int *y)
{
    int temp;
    temp = *x;
    *x = *y;
    *y = temp;
}

int main( int argc, char *argv[] )
{
    int a = 5;
    int b = 10;
    swap(&a, &b); //调用交换函数
    printf("交换结果为 a = %d, b = %d\n",a,b);
    return 0;
}

指针传递过程中,将a和b的地址分别传递给了x和y,在函数体内部改变了a、b所在地址的值,即交换了a、b的数值。

3. 引用传递

#include <stdio.h>

void swap(int &x, int &y);
void swap(int &x, int &y)
{
    int temp;
    temp = x;
    x = y;
    y = temp;
}

int main( int argc, char *argv[] )
{
    int a = 5;
    int b = 10;
    swap(a, b); //调用交换函数
    printf("交换结果为 a = %d, b = %d\n",a,b);
    return 0;
}

引用传递中,在调用swap(a, b);时函数会用a、b分别代替x、y,即x、y分别引用了a、b变量,这样函数体中实际参与运算的其实就是实参a、b本身,因此也能达到交换数值的目的。

注:严格来说,C语言中是没有引用传递,这是C++中语言特性,因此在.c文件中使用引用传递会导致程序编译出错。

1486C 函数

上面的是求两个数的最大值,我的是求三个数的最大值:

#include <stdio.h> 

int DoMax(int a, int b, int c){
    int max=a;
    if(b>max){
        max=b;
        if(c>max){
            max=c;
        }
    } else {
        if(c>max){
            max=c;
        }
    }
    return max;
}

int main(){
    int x, y, z, maxOne;
    printf("请输入三个数字(空格分隔):");
    scanf("%d%d%d",&x,&y,&z);
    maxOne=DoMax(x, y, z);
    printf("\n");
    printf("最大数为:%d; \n",maxOne);
    return 0;
}

1485C 函数

关于 main 函数的参数

在有些很专业的书会看到如下代码

int main( int argc, char *argv[] )

上面的代码中 main 函数带了参数。

但是有时又会看见main函数没有参数,如下:

int main()

那么 main 函数到底有没有参数,有没有参数会不会有什么影响?

main 函数其实与我们写的函数没有什么区别,它也会有自己的参数。

argc 和 argv 是 main 函数的形式参数。

这两个形式参数的类型是系统规定的。如果 main 函数要带参数,就是这两个类型的参数;否则main函数就没有参数。

变量名称argc和argv是常规的名称,当然也可以换成其他名称。在传入参数后main函数收到参数后就会做自己的事。那么,实际参数是如何传递给main函数的argc和argv的呢?我们知道,C程序在编译和链接后,都生成一个exe文件,执行该exe文件时,可以直接执行;也可以在命令行下带参数执行,命令行执行的形式为:可执行文件名称 参数1 参数2 ... ... 参数n。可执行文件名称和参数、参数之间均使用空格隔开。

如果按照这种方法执行,命令行字符串将作为实际参数传递给main函数。具体为:

  • (1) 可执行文件名称和所有参数的个数之和传递给 argc;
  • (2) 可执行文件名称(包括路径名称)作为一个字符串,首地址被赋给 argv[0],参数1也作为一个字符串,首地址被赋给 argv[1],... ...依次类推。