#include <stdio.h> // 系统环境变量(通常包含的是标准库头文件)
#include "header.h" // 当前路径 + 系统环境变量(通常包含的是用户自定义的文件)
#include <conio.h>
// 使用函数的三个步骤: 声明函数 + 定义函数 + 调用函数
// check 函数的函数声明: 函数声明应该写在函数调用之前
// 当函数的定义位于函数调用之前,就可以省略函数声明
int check(unsigned int number);
// 实参(实际参数):[函数调用]时实际传入的参数
// 形参(形式参数):[函数声明\定义]的参数列表中(会是实参的拷贝)
// C 语言中函数的传参方式: 值传递 + 址传递(指针传递)
// 值传递: 传递的只是实参的拷贝,所以通过
// 形参交换实参对实参没有任何的影响。
void swap1(int a1, int a2)
{
int temp = a1;
a1 = a2;
a2 = temp;
}
// 地址传递: 传递的是想要修改的变量的地址,
// 在通过指针交换两个数的时候,实际是
// 根据指针找到指针指向的地址,交换地址
// 上保存的数据。
void swap2(int* a1, int* a2)
{
// 通过解引用将指针 a1 指向的内存上保存的内容赋值给 temp
int temp = *a1;
// 将指针 a2 指向的内存上保存的内容放置到指针 a1 指向的位置
*a1 = *a2;
// 将 temp 的值放置到指针 a2 指向的位置
*a2 = temp;
}
// 用于打印形参地址的函数
void print_addr(int a)
{
// 形参只是实参的拷贝,例如存在函数调用 printf_addr(number)
// 编译器会为我们生成类似 int a = number; 的操作
printf("形参地址: %p\n", &a);
}
int main(void)
{
int number1 = 10, number2 = 30;
// 在函数的外部打印实参的地址
printf("实参地址: %p", &number1);
print_addr(number1);
// 调用一个值传递函数,传入的就是值
swap1(number1, number2);
// 调用一个指针传递函数,传入的就是[具体变量的地址]
swap2(&number1, &number2);
// 判断 100 以内的素数
for (int i = 3; i < 100; ++i)
{
if (check(i) == 1)
printf("%d 是素数\n", i);
}
return 0;
}
/* 函数定义的基本语法
返回值类型 符合命名的函数名(形参列表)
{
// 函数体: 整个函数的具体逻辑实现
// 如果有返回值类型的指定,需要使用
// return 返回相应类型的值(表达式)
return 1 + 1;
}
*/
// 一个函数,用于判断传入的整数是否是素数,如果是就返回 1 否则返回 0
// 根据作用确定名称 + 确定参数是 int + 确定返回值是 int
int check(unsigned int number)
{
// 素数: 自然界大于 1 的整数中,只能被 1 和自身整除的数
for (unsigned int i = 2; i < number / 2; ++i) // 2 <= i < number
{
// 如果说能够被其中的某一个数整除就直接返回 0
if (number % i == 0)
return 0;
}
// 如果整个循环执行结束,那么就说明没有能够被整除的数
return 1;
}