函数知识点与习题

定义函数

返回类型 函数名(参数1, 参数2…)
{
//函数体

(返回值, 除了void类型都要有返回值, 跟返回类型对应)
;

}

int main()
{
    return 0; //向操作系统返回0, 代表程序正常结束
}

自定义函数

如果自己写的这个函数写在main函数前面, 就可以不写函数声明
如果写在main函数后面的话, 必须在main函数前面写他的声明

函数声明 → 函数类型 函数名(参数类型 (变量名), 参数类型 (变量名))


#include <stdio.h>

//add函数在main后面, 所以需要加一个函数声明
int add(int, int); //参数的名字可以省略

int main()
{
    int a = 5, b = 6;
    printf("%d", add(a, b));
    return 0;
}

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



#include <stdio.h>

//不写声明
int add(int a, int b)
{
    return a + b;
}

int main()
{
    int a = 5, b = 6;
    printf("%d", add(a, b));
    return 0;
}

传值调用和传址调用



#include <stdio.h>

//传值调用
void swap(int a, int b) //a 和 b是形式参数
{
    int t = a;
    a = b;
    b = t;
}
int main()
{
    int a = 3, b = 4;

    printf("交换前a = %d b = %d\n", a, b);

    swap(a, b); // a 和 b是实际参数

    printf("交换后a = %d b = %d\n", a, b);
    return 0;
}



#include <stdio.h>


void hahaha()
{
    printf("hahaha");
}
//传址调用
void swap(int &a, int &b) //a 和 b是形式参数
{
    int p = a;
    a = b;
    b = p;
    hahaha();
}
int main()
{
    int a = 3, b = 4;

    printf("交换前a = %d b = %d\n", a, b);

    swap(a, b); // a 和 b是实际参数

    printf("交换后a = %d b = %d\n", a, b);
    return 0;
}



传值调用: 只是把swap(a, b) 里面a和b的 值 copy 了一份给了swap(int a, int b)里面的a 和 b
函数调用的时候传的参数 如swap(a, b); 里面的a 和 b 为实际参数
void swap(int a, int b) 里面的a 和 b为形式参数, a 和 b是定义在 swap这个栈空间里面新开的变量,只是把原来swap(a, b)里面a和b的值赋值给了它, 因此如果只是在swap(int a, int b)函数里面对a和b进行操作的话, 不会影响到main函数栈空间里面的a和b, 在执行完swap函数之后会销毁
swap(int *a, int *b) 也只是把a和b的地址作为参数传进来了,而并没有真正对a和b进行操作


传址调用: void swap(int &a, int &b) &相当于直接把a和b定义在内存中的地址给到了这个函数, 这个函数的操作会对内存中真正的a和b进行操作 

全局变量

全局变量定义在堆里面的, 如果对全局变量进行修改的话, 是会真正产生影响的

#include <stdio.h>

int n = 10;
void add() 
{
    n++; //真正对堆里面的n进行操作
}


int main()
{   
    add();

    printf("%d", n);
    return 0;
}


//局部变量优先 → 仍然是对栈中的n进行操作, 不会对全局变量定义在堆中的n有影响

#include <stdio.h>

int n = 10;
void add(int n) //实际影响的是栈里面的n, 而不是上面的定义在堆里面的n 
{
    n++;
}

int main()
{   
    add();

    printf("%d", n);
    return 0;
}




值为10的时候: n是定义在栈里面(局部变量) → 传值调用 / 局部变量优先, int add(int n) 跟 全局变量的n重名了

值为11的时候: 前提是n为全局变量, add的参数不是n

报错的情况: 前提是n为全局变量, add的参数不是n + 全局变量n定义在add函数后面


数组作为函数参数


//如果传的是数组的话, 对数组元素进行操作会直接改变数组的值
#include <stdio.h>

void change(int q[]) // int* q
{
    q[1] = 2;
    q[2] = 4;
}
int main()
{
    int q[5] = {0};

    change();
    printf("%d %d", q[1], q[2]);
    return 0;
}

递推

递归

6-1 sdut-C语言实验-计算组合数

int fun(int n, int m)
{
    //递归边界
    if(m == 0 || n == 1 || m == n) return 1;

    return fun(n - 1, m - 1) + fun(n - 1, m);
}

6-2 sdut-C语言实验- n个数的排序

void sort(int *p, int n)
{
    for(int i = 1; i <= n - 1; i++)
    {
        for(int j = 0; j < n - i; j++)
        {
            if(p[j] > p[j + 1])
            {
                int t = p[j];
                p[j] = p[j + 1];
                p[j + 1] = t;
            }
        }
    }
}


void sort(int *p, int n)
{
    for(int i = 1; i <= n - 1; i++)
    {
        for(int j = 0; j < n - i; j++)
        {
            if(*(p + j) > *(p + j + 1))
            {
                int t = *(p + j);
                *(p + j) = *(p + j + 1);
                *(p + j + 1) = t;
            }
        }
    }
}

6-3 sdut- C语言实验——矩阵下三角元素之和

上下三角都是以主对角线为界限
下三角 → j <= i



int f(int (*p)[10], int n)
{
    int sum  = 0;
    for (int i = 0; i < n; i++)
    {
        for(int j = 0; j < n; j++)
        {
            if(j <= i) sum += p[i][j];
        }
    }
    return sum;
}

6-4 sdut-C语言实验- N


long long int f(long long int n)
{
    long long ans = 1;
    for(int i = 1; i <= n; i++)
    {
        ans *= i;
    }
    return ans;
}

6-5 sdut-C语言实验-使用函数验证哥德巴赫猜想


int isPrime(int x)


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值