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

 

转载于:https://my.oschina.net/WinkJie/blog/3082432

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值