鹏哥C语言40---函数参数与函数调用

#define _CRT_SECURE_NO_WARNINGS

//一个工程中可以有多个 .c,但是只能有一个库函数

//------------------------------------------------------------------------------------------------------------3. 函数的参数

// 实际参数(实参)和 形式参数(形参)

#include <stdio.h>

#include <math.h>

//--------------------------------------------写一个函数可以交换两个整型变量的内容 (错版)

/*

void Swap(int x, int y) //函数定义

{

int z = 0;

z = x;

x = y;

y = z;

}

int main()

{

int a = 0;

int b = 0;

scanf("%d %d", &a, &b);

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

//调用函数来交换

Swap(a, b); // 只需要交换,不需要返回,所以不用 int

// a 和 b 叫实参,函数里的 x y 叫形参(形式参数)

// 实参ab传给形参xy时,形参只不过是实参的一份临时拷贝,只拷贝过去了数据,但是实参的独立空间还在

// 所以修改形参,不会影响实参

printf("交换后: a=%d b=%d\n", a, b);//10 20 ---------------------------(交换失败)

return 0;

}

*/

//--------------------------------------------写一个函数可以交换两个整型变量的内容 (对版)

//void Swap(int* px, int* py) // 交换数值-----传地址实现

//{

// int z = *px; //z=a

// *px = *py; //a=b

// *py = z; //b=a

//}

//

//int ADD(int x, int y) // 求和函数-----为什么不用传地址?

//{

// int s = 0;

// s = x + y;

// return s;

//}

//

//int main()

//{

// int a = 0;

// int b = 0;

// scanf("%d %d", &a, &b);

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

//

//

// Swap(&a, &b); //把地址所指向的内容的值交换

// //&a, &b 是实参

// printf("交换后: a=%d b=%d\n", a, b);// 20 10----------------------交换成功

//

// int add=ADD(a, b); // a 和 b 的值不需要改变时,就必须要取地址

// // a,b是实参

// printf("%d\n", add);

//

// return 0;

//}

//--------------------------------------------------------------------------------------------------3.1 实际参数(实参)

/*

真实传给函数的参数,叫实参

实参可以是:常量,变量,表达式,函数等

无论实参是何种类型的变量,在进行函数调用时,他们必须有确定的值,以便把这些值传送给形参

*/

//--------------------------------------------------------------------------------------------------3.2 形式参数(形参)

/*

形式参数是指函数名后括号中的变量,因为形参只有在函数被调用的过程中才实例化(分配内存单元)

所以叫形参。形式参数当函数调用完之后就彻底销毁了。因为形参只有在函数中才有效。

*/

//形参实例化之后相当于实参的一份临时拷贝,对形参的修改不会影响实参

//-----------------------------------------------------------------------------------------------------------4. 函数的调用

//--------------------------------------------------------------------------------------------------4.1 传值调用

//函数的实参和形参分别占有不同的内存块,对形参的修改不会影响实参

//--------------------------------------------------------------------------------------------------4.2 传址调用

/*

传址调用 是把函数外部创建变量的 地址 传递给函数参数 的一种调用函数的方式

这种传参方式可以让 函数 和 函数外边 的变量建立起真正的联系,也就是函数内部可以直接操作函数外部的变量

*/

/*

void Swap1(int x, int y)

{

int z = 0;

z = x;

x = y;

y = z;

}

void Swap2(int* px, int* py) //形参的指针变量 px py 存的是实参的地址

{

int z = *px;

*px = *py;

*py = z;

}

int main()

{

int a = 0;

int b = 0;

scanf("%d %d", &a, &b);

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

Swap1(a, b); //传值调用

Swap2(&a, &b); //传址调用

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

return 0;

}

*/

//--------------------------------------------------------------------------------------------------4.3 练习

//--------------------------------0. 打印100-200之间的素数(版本1:没有函数)------------------------------

// 素数是只能被 1和它本身 整除的数

/*

int main()

{

int i = 0;

int count = 0;

// for (i = 100; i <= 200; i++)

//---------可优化--------------------------------------------------

for (i = 101; i <= 200; i+=2) //排除偶数

{

//判断 i 是否是素数

//是素数就打印

//拿 2-----i-1之间的数字,去试除

int flag = 1;// flag是1 表示他是素数

int j = 0;

//for (j = 2; j <= i - 1; j++)

//---------可优化--------------------------------------------------

for (j = 2; j <=sqrt(i); j++) // sqrt()数学库函数,开平方使用,需要引用头文件 <math.h>

{

if (i% j == 0)

{

flag = 0;

//break;

}

}

if (flag == 1)

{

count++;

printf("%d ", i);

}

}

printf("\ncount=%d\n", count);

return 0;

}

*/

//------------------------------------1.写一个函数,判断一个数是不是素数---------------------------------

//是素数,返回1

//不是素数,返回0

int is_prime(int n)

{

int j = 0;

for (j = 2; j <= sqrt(n); j++)

{

if (n % j == 0)

{

return 0;

}

}

return 1;

}

int main()

{

int i = 0;

int count = 0;

for (i = 101; i <= 200; i += 2) //排除偶数

{

if (is_prime(i)) //调用函数 如果 is_prime(i) 为真,打印

{

count++;

printf("%d ", i);

}

}

printf("\ncount=%d\n", count);

return 0;

}

相关推荐
yuanManGan12 分钟前
数据结构漫游记:静态链表的实现(CPP)
数据结构·链表
罗伯特祥14 分钟前
C调用gnuplot绘图的方法
c语言·plot
嵌入式科普1 小时前
嵌入式科普(24)从SPI和CAN通信重新理解“全双工”
c语言·stm32·can·spi·全双工·ra6m5
火星机器人life1 小时前
基于ceres优化的3d激光雷达开源算法
算法·3d
虽千万人 吾往矣1 小时前
golang LeetCode 热题 100(动态规划)-更新中
算法·leetcode·动态规划
arnold662 小时前
华为OD E卷(100分)34-转盘寿司
算法·华为od
ZZTC2 小时前
Floyd算法及其扩展应用
算法
lqqjuly3 小时前
特殊的“Undefined Reference xxx“编译错误
c语言·c++
lshzdq3 小时前
【机器人】机械臂轨迹和转矩控制对比
人工智能·算法·机器人
2401_858286114 小时前
115.【C语言】数据结构之排序(希尔排序)
c语言·开发语言·数据结构·算法·排序算法