参数和指针

参数和返回值

类型名 函数名(参数列表)
{
 函数体
}

形参和实参

#include <stdio.h>

int sum(int, int);

int sum(int x, int y)
{
    return (x + y);//形参仅在函数内部有效
}

int main()
{
    sum(3, 5);

    return 0;
}

传值和传址

传值

#include <stdio.h>

void swap(int x, int y);  // 声明

void swap(int x, int y)
{
    int temp;
    printf("in swap, before: x = %d, y = %d\n", x, y);

    temp = x;
    x = y;
    y = temp;
    printf("in swap, after: x= %d, y = %d\n", x, y);
}

int main()
{
    int x = 3, y = 5;
    printf("in main, before: x = %d, y = %d\n", x, y);
    swap(x, y);
    printf("in main, after: x = %d, y = %d\n", x, y);

    return 0;
}

in main, before: x = 3, y = 5
in swap, before: x = 3, y = 5
in swap, after: x= 5, y = 3
in main, after: x = 3, y = 5

传址

#include <stdio.h>

void swap(int *x, int *y);  // 声明

void swap(int *x, int *y)
{
    int temp;
    printf("in swap, before: x = %d, y = %d\n", *x, *y);

    temp = *x;
    *x = *y;
    *y = temp;
    printf("in swap,after: x= %d, y = %d\n", *x, *y);
}

int main()
{
    int x = 3, y = 5;
    printf("in main, before: x = %d, y = %d\n", x, y);
    swap(&x, &y);
    printf("in main, after: x = %d, y = %d\n", x, y);

    return 0;
}

in main, before: x = 3, y = 5
in swap, before: x = 3, y = 5
in swap,after: x= 5, y = 3
in main, after: x = 5, y = 3

可变参数

需要使用头文件#include <stdarg.h>

#include <stdarg.h>
#include <stdio.h>

int sum(int n, ...);

int sum(int n, ...)
{
    int i, sum = 0;
    va_list vap;

    va_start(vap, n);
    for (i = 0; i < n; i++)
    {
        sum += va_arg(vap, int);
    }
    va_end(vap);

    return sum;
}

int main(void)
{
    int result = sum(3, 1, 2, 3);
    printf("result = %d\n", result);
    return 0;
}

result = 6

myPrintf()实现

#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>

char *myItoa(int value, char *string);
int myPrintf(char *, ...);

char *myItoa(int value, char *string)
{
    int flag = 0;
    int len = 0;
    int i = 0;
    char t = '0';
    if (value == 0)
    {
        string[0] = '0';
        string[1] = '\0';
    } else
    {
        if (value < 0)
        {
            value = -value;
            flag = 1;
        }
        while (value / 10 != 0 || value % 10 != 0)
        {
            string[i++] = (value % 10) + '0';
            value /= 10;
            len++;
        }
    }
    if (flag)
    {
        string[i++] = '-';
        len++;
    }
    string[i] = '\0';
    for (i = 0; i < len / 2; i++)
    {
        t = string[i];
        string[i] = string[len - 1 - i];
        string[len - 1 - i] = t;
    }
    return string;
}

int myPrintf(char *str, ...)
{
    int len = 0;
    char *s = (char *)malloc(sizeof(char) * 20);

    va_list vap;
    va_start(vap, str);
    while (*str != '\0')
    {
        if (*str == '%')
        {
            if (*(str + 1) == 'd')
            {
                s = myItoa(va_arg(vap, int), s);
                while (*s != '\0')
                {
                    putchar(*s);
                    len++;
                    s++;
                }
                str++;
            } else if (*(str + 1) == 's')
            {
                s = va_arg(vap, char *);
                while (*s != '\0')
                {
                    putchar(*s);
                    len++;
                    s++;
                }
                str++;
            } else if (*(str + 1) == 'c')
            {
                putchar(va_arg(vap, int));
                str++;
                len++;
            } else
            {
                putchar(*str);
                len++;
            }
        } else
        {
            putchar(*str);
            len++;
        }
        str++;
    }
    va_end(vap);
    return len;
}

int main(void)
{
    int i;

    i = myPrintf("Hello %s\n", "FishC");
    myPrintf("共打印了%d个字符(包含\\n)\n", i);
    i = myPrintf("int: %d, char: %c\n", -520, 'H');
    myPrintf("共打印了%d个字符(包含\\n)\n", i);

    return 0;
}

常用操作

不使用第三变量交换两变量:

void swap(int *n1, int *n2){
    *n1 += *n2;
    *n2 = *n1 - *n2;
    *n1 -= *n2;
}

产生随机且不重复的数 1~11:

#include <stdio.h>
#include <time.h>
#include <stdlib.h>

int main(void) {
    srand(time(0));// 种下随机数种子
    int nums[11] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11};

    for(int i = 0;i < 11;i++) {
        int r = rand() % 11 + 1; //产生随机数 1 ~ 11
        int t = nums[i];
        nums[i] = nums[r];
        nums[r] = t;
    }

    return 0;
}

数组作为形参,会退化为指针

void printArray(int nums[]) { //数组作形参 会退化成指针
    sizeof(nums);// 是一个整形指针所占字节数  4

}

设置宽度 < 实际宽度:设置失效

printf()参数

- :左对齐
printf("%3f", 1.34454); //1.344540​​

隐式类型转换:若参与运算的数据类型不同,先转换成同一类型:

  1. 转换按照数据长度增加的方向进行以保证精度不降低 精度小 -> 精度大。.float : 4字节 short: 8字节
  2. 类型不同时, 简单类型向复杂类型转换 char -> short -> int -> float -> double
  3. 赋值运算时,赋值号两边数据类型不相同时,将会把右边表达式的数据类型转化成左边表达式的数据类型
  4. 在赋值运算当中,赋值号左右两端的类型应当是相互兼容的

输入某年某月某日,判断这一天是这一年的第几天?

void getDays(int nowYear, int nowMonth, int nowDay)
{
  
}

函数原则

  • 低耦合
  • 高内聚
  • 一个函数仅实现一个功能

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值