include
using namespace std;
/*
指针和引用:
指针:指向某一块内存的变量。其本身存储的信息就是内存地址的首地址,其类型决定指向内存的大小。
变量:某一块内存地址数据值的名字。
引用:已定义变量的别名。
比喻:
超市柜子:
1、第一排右数第三个--------------地址(指针)
2、柜子号为18--------------------变量名
3、18难记,谐音记忆为“要发”----引用
*/
//指针(int、int&、int&、int&、int**)
//以值交换为例
//int
void swap1(int a, int b) { //传进来的是形参
int tmp;
tmp = a;
a = b;
b = tmp;
}
void main01()
{
int a = 1, b = 2;
swap1(a, b);
cout << "a=" << a << endl;
cout << "b=" << b << endl; //交换失败,交换的是形参的值,无法达到交换的目的。
system("pause");
}
//小结:形参无法改变实参的值,指针却可以。
/
因为形参是实参传递给子函数的时候定义的一个新的变量,初始时值相等
用指针的时候,传递的不是值而是实参的地址,改变的就是实参的值。
*/
//int*
void swap2(int* a, int *b) { //传递进来的是实参的地址
int tmp;
tmp = *a;
*a = *b;
*b = tmp;
}
void main02()
{
int a = 1, b = 2;
swap2(&a, &b);
cout << "a=" << a << endl;
cout << "b=" << b << endl; //交换成功
system("pause");
}
//问题1:int a与int a有没有区别? 答:没区别。
//int&
void swap3(int& a, int& b) { //引用,传递进来的是实参
int tmp;
tmp = a;
a = b;
b = tmp;
}
void main03() {
int a = 1;
int b = 2;
swap3(a, b);
cout << "a=" << a << endl;
cout << "b=" << b << endl; //交换成功,引用即别名
system("pause");
}
//问题1:int &a与int& a有没有区别? 答:没区别。
//int*&
void swap4(int &a, int&b) { //传入的是a的地址,这里&a表示a的别名,其实还是一个东西。想想18和“要发”的关系
int tmp = a; //里面操作和a一样,整体可以理解为超市的柜子号码18和“要发”的关系。
*a = *b; //传入的是别名的地址?
*b = tmp;
}
void main() {
int a = 1;
int b = 2;
int *aPtr = &a; //用aPtr存放a地址
int *bPtr = &b;
swap4(aPtr, bPtr);
cout << "a=" << a << endl;
cout << "b=" << b << endl; //交换成功
system("pause");
}
//int&*
//void swap5(int &a, int &b) {} //c++定义失败
//小结:没有&*a的形式
//int**
void swap6(int **a, int **b) { //目的都是要对实参进行操作,这里传入的是地址的地址
int tmp;
tmp = **a;
**a = **b;
**b = tmp;
}
void main06() {
int a = 1, b = 2;
int *aPtr = &a; //存放变量a的地址
int *bPtr = &b;
int **aPtr2 = &aPtr; //存放变量a的地址的地址
int **bPtr2 = &bPtr;
swap6(aPtr2, bPtr2);
cout << "a=" << a << endl;
cout << "b=" << b << endl;
system("pause");
}
/*
问题1:地址不能直接存放给变量,即int b=&a。为什么?
答:进行某些操作时,如递增+1 需要的不是+1个,二是加1个整型变量,所以要用地址来进行操作。即*b=&a;。
小结:变量地址不能直接存放,需要通过指针来间接存放。 存放变量地址的格式: int *a=&b;
*/
/*
总结:
1、void swap1(int a, int b)----------传入的是形参,无法对实参进行内存实际操作。
2、void swap2(int* a, int b)--------传入的是实参地址,可以对实参进行内存实际操作。
3、void swap3(int& a, int& b)--------引用的格式,传入的是实参的地址,可以对实参进行内存实际操作。相当于已经确定了实参,内部函数可以直接对实参进行操作,非特殊情况不需要加或&。
4、void swap4(int &a, int&b)-------传入的是实参地址的指针,格式化操作:外部:存放地址:b=&a;内部:a
5、void swap5(int &a, int &b)------格式错误
6、void swap6(int a, int b)------传入的是地址的地址,格式化操作:外部:存放一地址:*b=&a; 存放二地址:c=&b;内部:a;
要想对实参的内存进行操作,就要先锁定实参。然后根据格式改操作。
*/