值交换-及求素数

#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;
}

 

posted @ 2020-02-24 20:35  冫恋丶  阅读(144)  评论(0编辑  收藏  举报