理论
关于函数调用的方式有两类:传值调用和传址调用
传值调用:函数的形参和实参分别占有不同的内存块,对形参的修改不会影响实参。
传址调用:把函数外部创建变量的内存地址传递给函数参数的一种调用方式。可以让函数和函数外面的变量建立起真正的联系,也就是函数内部可以直接操作函数外部的变量。
我们可以用一串代码来解释这两者的区别
#include<stdio.h>
int fun1(int a,int b)
{
int c;
c=a;
a=b;
b=c;
}
int fun2(int *pa,int *pb)
{
int d;
d=*pa;
*pa=*pb;
*pb=d;
}
void main(){
int a=10,b=20;
fun1(a,b);
printf("a=%d,b=a%d\n",a,b);
fun2(&a,&b);
printf("a=%d,b=%d",a,b);
}
在这串代码中,fun1是传值变量,fun2是传址变量,正如上面所说:
fun1内部的代码叫做形参,它里面的东西不会影响到主函数内实参的改变,所以在输出时,a,b没有改变
fun2内部的代码直接把a,b的内存地址拿过来了,相当于fun2中的变量与主函数里面的变量建立了联系,在fun2里面做修改就会影响到主函数里面相对变量的值,所以我们在fun2里面把a,b交换后,主函数中的a,b也受到了影响。
题目
打印100~300之间的素数
素数: 一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数叫素数
#include<stdio.h>
int fun(int i)
{
}
void main(){
int i;
for(i=100;i<=300;i++) {
if (fun(i) == 1) {
printf("%d ", i);
}
}
}
在写外部函数前,我们都应该先看一下主函数,然后根据主函数来理解外部函数中要让我们做什么
根据这个主函数我们可以知道,我们要在外部函数中判断100~300之间有哪些素数
首先,我们要用一个变量遍历一遍小于 i 的所有数,以此来看看有哪些数除了1和本身不能被其他自然数整除
遍历完之后,如果可以被其他自然数整除,那就return 0,否则,return 1。
具体代码如下:
int fun(int i)
{
int a;
for(a=2;a<i;a++) {
if (i % a == 0)
return 0;
}
return 1;
}
判断是否为闰年
基础规律:非整百年能被4整除而不能被100整除。 这是最基本的判断闰年的方法。
完备原则:整百年能被400整除而不能被3200整除。
#include<stdio.h>
int fun(int i)
{
}
void main(){
int i;
for(i=1000;i<=2000;i++) {
if (fun(i) == 1)
printf("%d ", i);
}
}
通过主函数我们可以知道,外部函数是要判断是否为闰年
闰年的规则已经写在题目下方了,按照规则,我们可以得出这样一串代码
int fun(int i)
{
if(i%4==0 && i%100!=0)
return 1;
else if(i%400==0)
return 1;
else
return 0;
}
这里整年和非整年要分别判断,所以我们要用到两个if
由于这里最高是2000,所以我在第二个if里面没有加上不等于3200这个条件