形参与实参
-
demon 1:
#include <stdio.h> void fun(int *, int *); int main() { int x = 3, y = 5,*p = &x, *q = &y; fun(p,q); printf("%d, %d\n", *p, *q); fun(&x, &y); printf("%p,%p\n", p, q); } void fun(int *a, int *b) { int *c; c = a; a = b; b = c; } 输出结果:3,5,3,5
解释:子函数fun(int *a, *b)的功能是交换形参a,b 的值;主函数调用子函数fun(p,q)后,实参p,q和&x,&y的值之间并没有交换。
-
demon 2:
#include <stdio.h> int k = 7; void f(int **s) { int *t = &k; *s = t; printf("%d,%d,%d,", k, *t, **s); } int main() { int i =3, *p = &i, **r = &p; f(r); printf("%d,%d,%d\n", i, *p, **r); } 输出结果 7,7,7,3,7,7
该示例中变量" K "为全局变量,调用f()函数将指向p指针的指针r复制给指向指针的指针s,子函数中将s指针指向t指针,t指针指向变量k的地址。因此实参i没有变化。所以输出结果为7,7,7,3,7,7
参数的传递
-
按值传递:
给函数传递参数(变元)时,先制作参数值的副本存储在栈上,再使这个副本用于函数,而不是使用初始值#include <stdio.h> void change(int); //按值传递 int main() { int num = 9; change(num); //调用函数 printf("%d\n", num); return 0; } void change(int num) { num++; }
-
引用传递
在调用函数时将实际参数的地址传递到函数中,那么在函数中对参数进行的修改,将影响到实际参数#include <stdio.h> void change(int *); //引用传递 int main() { int num = 9; change(&num); //调用函数 printf("num = %d\n", num); } void change(int *num) { *num += 1; }
demon
#include <stdio.h>
#include <stdlib.h>
#define N 5
void input(double[]); //录入元素
void sort(double[]); //排序
void show(double[]); //显示元素
int find(double *scores, double findNum); //查找
//书写一个小型的学生成绩管理系统
int main()
{
//1.录入;2.排序;3.按某种格式打印
double scores[N] = {98, 56, 78, 54, 88};
printf("scores数组的元素个数:%d\n", sizeof(scores) / sizeof(scores[0])); //测量数组大小
double findNum; //要查找的数字
input(scores); //录入,不需要&
show(scores); //打印
sort(scores); //排序
printf("排序后:");
show(scores);
printf("请输入要查找的数字;");
scanf("%lf", &findNum);
printf("找到的数字下标为:%d\n", find(scores, findNum));
return 0;
}
/**
录入元素
*/
void input(double scores[])
{
int i;
for(i = 0; i < N; i++)
{
printf("请输入第%d门课的成绩:", i + 1);
scanf("%lf", (scores + i)); //换种写法,scanf("%lf", &scores[i]);
}
}
/**
显示元素
*/
void show(double scores[])
{
int i;
printf("************************************************\n");
printf("语文\t数学\t英语\t物理\t化学\n");
for(i = 0; i < N; i++)
{
printf("%.2lf\t", *(scores + i));
}
printf("\n**********************************************\n");
}
/*
排序
*/
void sort(double scores[])
{
int i , j;
double temp;
for(i = 0; i < N - i; i++)
{
for(j = 0; j < N - i -1; j++)
{
if(scores[j] > scores[j + 1])
{
temp = scores[j];
scores[j] = scores[j + 1];
scores[j + 1] = temp;
}
}
}
}
/**
查找元素下标
*/
int find(double *scores, double findNum)
{
int findIndex = -1; //要查找的下标
int i;
for(i = 0; i < N; i++)
{
if(findNum == scores[i])
{
//记录下要查找的下标,结束查找动作
findIndex = i;
break;
}
}
return findIndex;
}