前言:
谭浩强老师的书,很详细,但是个人感觉很冗余,就比如一个指针引用数组就穷举了一遍实参形参的情况,像这些东西都能用一句“指针与数组首地址等价”推出来的。这样冗杂的内容别说帮助学习,简直就是把知识复杂和模糊化。
本人此系列一是复习一遍之前没学好的C语言,二是提纲挈领地捋一下知识的难点,并且只说特殊及特别的东西,就是如果与之前知识不矛盾或者说可以推出来的就不提了。
下面就用一个例子来展示下如何不用全局变量改变函数外的多个值(除了全局变量就是指针了。函数返回值又只能返回1个或0个值)
例子引自,谭浩强《C程序设计》第四版 P226~P229例子
#include <stdio.h>
void main()
{
void swap1(int *p1, int *p2);
void swap2(int *p1, int *p2);
int a, b;
int *p1, *p2;
scanf("%d%d", &a, &b);
p1 = &a;
p2 = &b;
if (a < b) swap1(p1, p2);
printf("max=%d,min=%d\n", a,b);
if (a < b) swap2(p1, p2);
printf("max=%d,min=%d\n", a, b);
return;
}
/*【因为形参生命周期是函数内,用完就销毁,所以swap1交换指针无用,
swap2交换所存值而销毁的是形参指针而不会销毁变量值故而有效】*/
void swap1(int *p01, int *p02)//函数内是交换指针地址
{
int *p;
p = p01;
p01 = p02;
p02 = p;
}
void swap2(int *p01, int *p02)//函数内是交换指针地址所存之值
{
int p;
p = *p01;
*p01 = *p02;
*p02 = p;
}
书中总是提及函数的“虚实结合”,实参形参形象来讲是什么
上面代码有一句注释我要多说一句:
因为形参生命周期是函数内,用完就销毁,所以swap1交换指针无用,
swap2交换所存值而销毁的是形参指针而不会销毁变量值故而有效
(swap1)是为了展示函数的“虚实结合”和“值传递”的特点,1中就因为改的是形参指针(生命周期仅仅在函数里)改完就因函数被用完而被销毁,而无法改变外面的值。
(swap2)是为了展示指针改函数外面的值,2中就是形参指针实实在在改的是swap1函数外的地址里的值而形参指针被销毁后没人再管刚改的那些值。