是的。这个PPT就是为了说明用void swap2(int x, int y)交换不了通过形参传入的元素。
创新互联公司-专业网站定制、快速模板网站建设、高性价比垫江网站开发、企业建站全套包干低至880元,成熟完善的模板库,直接使用。一站式垫江网站制作公司更省心,省钱,快速模板网站建设找我们,业务覆盖垫江地区。费用合理售后完善,十载实体公司更值得信赖。
为什么交换不了?
因为void swap2(int x, int y)的形式参数是传值模式。
C/C++语言规定:以传值模式调用函数,在调用过程中,函数需先将形参做一个拷贝,然后基于新的拷贝进行计算。
如上例,执行调用swap2(a[0],a[1]),swap2会先将a[0]的值拷贝给x,将a[1]的值拷贝给y,然后在函数体内交换x、y的值,这样对a[0]、a[1]毫无影响。
怎样通过函数调用交换a[0]、a[1]的值?
答案是:通过传引用调用,即将函数声明为void swap2(int x, int y)。
C++语言规定:引用可以看作是变量的别名。别名类似于人的小名之类,一个人大名、小名虽不同,但都指的是这个人。
同样如上例,执行调用swap2(a[0],a[1]),swap2将x视作a[0]的别名、将y视作a[1]的别名,这样在函数体内交换x、y的值,实际上交换的是a[0]、a[1]的值。
引用是C++语言引入的特性,C语言中没有引用。若要用C语言实现通过函数交换a[0]、a[1]的值,怎么办?
答案是:模拟传引用调用,即将函数声明为void swap2(int* xp, int* yp)。
模拟传引用调用本质上仍是传值调用,只不过传入函数的是原始参数的地址。
同样如上例,执行调用swap2(a+0,a+1),a+0是a[0]的地址,a+1是a[1]的地址。相应地,swap将a[0]的地址值拷贝一份给xp,将a[1]的地址值拷贝一份给yp。函数体内,swap2通过xp、yp即a[0]、a[1]的地址的新拷贝,操纵a[0]、a[1]的值。
这种方式除了需要改造swap2的声明,还需改造swap2的函数体,即其实现。
函数是用户与程序的接口,在定义一个函数前,首先要清楚以下三个问题。1) 函数的功能实现及算法选择。算法选择会在后续文章详细讲解,本节重点关注函数的功能实现。一般选取能体现函数功能的函数名,且见名知意,如求和函数的函数名可取为 add,求最大值的函数名可取为 max,排序函数可取名为 sort 等。2) 需要用户传给该函数哪些参数、什么类型,即函数参数。3) 函数执行完后返回给调用者的参数及类型,即函数返回值类型。 函教定义格式 函数定义的一般格式为: 返回类型 函数名 (类型参数1,类型参数2,…) {函数体 }也可以不含参数,不含参数时,参数表中可写关键字 void 或省略,为规范起见,教程中对没有参数的函数,参数表中统一写 void。例如: 类型 函数名 () {函数体 }等价于: 类型 函数名 (void) //建议的书写方式 {函数体 } 如果该函数没有返回类型,则为 void 类型。例如: void add (int x,int y) {printf ("sum=%d\n", x+y); } 除了 void 类型外,在函数体中,均需要显式使用 return 语句返回对应的表达式的值。 函教返回值 函数的值是指调用函数结束时,执行函数体所得并返回给主调函数的值。 关于函数返回值说明如下。1) 带返回值的函数,其值一般使用 return 语句返回给调用者。其格式为: return 表达式;或者 return (表达式);例如: int add (int a, int b) {return (a + b); //return 后为表达式 } 函数可以含一个或多个 return 语句,但每次调用时只能执行其中一个 return 语句。例如,求整数绝对值的函数: int f (int n) //含多个return语句,但每次调用只执行一个 {if (n = 0)return n;elsereturn -n; }
.前言:
写在前面,由于我大一学过java多以对于本书的前几张没有什么记录。那是因为他和java的数据类型、循环结构、 数组、函数 之类的这一些都差不太多。前面稍微重要的就是函数了和java稍有不一致,个人觉得没有必要再写了,所以我从函数开始写起。学习C语言就要学习他的精华。譬如: 指针、自定义数据类型、文件。
汉诺塔问题
2.字符串问题 : C中没有字符串类型,只有字符数组
例如: char asd[] = {"hellow "}
使用scanf输入的时候不用取地址赋值,直接使用字符数组名字即可,因为他们在内存中的地址是连续的
字符串的几个函数“#include string.h”.puts gets、strlen、strcmp、strcat
3.数组在实参和形参中的传递问题
数组元素的传递 a[45]、将数组名放在形参是把该数组的首地址传递,操作形参就是操作实参
4.二维数组中的列必须有大小,相对的二维数组中的一维的大小可以没有,系统会自动分配。(学习完指针后会有更明确的理解)
5.变量问题
P232
6.内部函数和外部函数
#include stdio.h
#include math.h
double mysqrt(double a, double x0)
{
if (a0)return -1;
double x1 = 1.0 / 2 * (x0 + a / x0);
if (fabs(x1 - x0) 1e-5)return x1;
return mysqrt(a, x1);
}
int main()
{
double a, x0 = 1.0;
printf("Enter a:");
scanf("%lf", a);
printf("The sqrt of %lf=%lf\n", a, mysqrt(a, x0));
return 0;
}