欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

C++指针小结

程序员文章站 2022-07-03 14:49:03
...

C++指针小结

#include <iostream>
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; 
要想对实参的内存进行操作,就要先锁定实参。然后根据格式改操作。
*/