参数和返回值
类型名 函数名(参数列表)
{
函数体
}
形参和实参
#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
隐式类型转换:若参与运算的数据类型不同,先转换成同一类型:
- 转换按照数据长度增加的方向进行以保证精度不降低 精度小 -> 精度大。.float : 4字节 short: 8字节
- 类型不同时, 简单类型向复杂类型转换 char -> short -> int -> float -> double
- 赋值运算时,赋值号两边数据类型不相同时,将会把右边表达式的数据类型转化成左边表达式的数据类型
- 在赋值运算当中,赋值号左右两端的类型应当是相互兼容的
输入某年某月某日,判断这一天是这一年的第几天?
void getDays(int nowYear, int nowMonth, int nowDay)
{
}
函数原则
- 低耦合
- 高内聚
- 一个函数仅实现一个功能