总结:
1、要把每个变量表示的语义信息,清晰地清楚地确认明白!有利于有许多变量进行复杂变化的过程。
例如get_num(int k, int n, int &x)函数中,涉及到
k 表示还有多少个可能状态数需要跳跃?第一百万,还需要按顺序跳跃k = 999999个可能状态数;
n 表示,我当前这个位置数字每向上变化一次,跳跃了多少个可能状态数:是一个阶乘数,fac[i - 1];
step = k / n 我利用当前这个位置数字,最多可以向上变化几次,来最大程度减少需要跳跃的可能状态数。(保证按顺序跳跃,维持字典序)
x 表示当且这个位置上的为数字几,以及最后向上跳跃变化为了数字几?
i和num[i] 这个数字,有没有用过?(num[i] = 1则可用,= 0则不可用;只能用处于后面的数字,前面的数字都根据需要安排好了)
t 用于遍历数字i,看看向上变化,还有哪些数字可以用,没用过,以及变化step次会停在哪个没有用过的数字i上;
2、为什么不是这里写地址&x,上面写指针*x呀?而是这里写变量x,上面写该变量的地址&x?对于更改x而言,是等价的写法吗?
int get_num(int k, int n, int &x) //传一个“引用”进去?
......
k = get_num(k, fac[i - 1], x)
int get_num(int k, int n, int *x)
......
k = get_num(k, fac[i - 1], &x)
#include<stdio.h>
void myswap1(int x, int y)
{
int t;
t=x;
x=y;
y=t;
}
void myswap2(int *p1, int *p2)
{
int t;
t=*p1;
*p1=*p2;
*p2=t;
}
void myswap3(int &x, int &y)
{
int t;
t=x;
x=y;
y=t;
}
int main()
{
int a,b;
a = 2;
b = 3;
myswap1(a,b); //作为对比,直接交换两个整数,显然不行
printf("调用交换函数后的结果是:%d 和 %d\n", a, b);
a = 2;
b = 3;
myswap2(&a,&b); //交换两个整数的地址
printf("调用交换函数后的结果是:%d 和 %d\n", a, b);
a = 2;
b = 3;
myswap3(a,b); //直接以变量a和b作为实参交换
printf("调用交换函数后的结果是:%d 和 %d\n", a, b);
return 0;
}
在第一个程序中,传值不成功的原因是指在形参上改变了数值,没有在实参上改变数值。
在第二个程序中,传地址成功的原因利用指针改变了原来的地址,所以实参就交换了。
在第三个程序中,引用是直接改变两个实参变量a,b的值,所以就交换了。
注:引用就是某一变量(目标)的一个别名,对引用的操作与对变量直接操作完全一样。
引用的声明方法:类型标识符 &引用名=目标变量名;
【例】:int a; int &ra=a; //定义引用ra,它是变量a的引用,即别名
说明:
(1)&在此不是求地址运算,而是起标识作用。
(2)类型标识符是指目标变量的类型。
(3)声明引用时,必须同时对其进行初始化。
(4)引用声明完毕后,相当于目标变量名有两个名称,即该目标原名称和引用名,且不能再把该引用名作为其他变量名的别名。
ra=1; 等价于 a=1;
(5)声明一个引用,不是新定义了一个变量,它只表示该引用名是目标变量名的一个别名,它本身不是一种数据类型,因此引用本身不占存储单元,系统也不给引用分配存储单元。故:对引用求地址,就是对目标变量求地址。&ra与&a相等。
(6)不能建立数组的引用。因为数组是一个由若干个元素所组成的集合,所以无法建立一个数组的别名。