指针、引用、传值、传址

个人总结
首先定义:
struct BinaryTreeNode
{
	int  m_nValue;
	BinaryTreeNode  *  m_pLeft;
	BinaryTreeNode  *  m_pRight;
};


定义变量:
1、BinaryTreeNode  * pTreeNode;
2、BinaryTreeNode  * * n_pTreeNode;
3、BinaryTreeNode k;
4、 BinaryTreeNode   & m=k; (引用变量必须初始化)


  • 指针:
定义:地址也称为指针,即变量所存储区域的第一个字节的地址。
指针变量:这种类型的变量存放的是内存地址值
与指针有关的运算符:
&——取址运算符 :返回变量的内存地址
例如:pTreeNode=&k; (取变量k的地址 赋给 指针变量pTreeNode 即 指针变量pTreeNode
指向  BinaryTreeNode 类型的变量k )
注意:n_pTreeNode=&pTreeNode 是返回指针变量pTreeNode的地址 而非它存储的值(k的内存地址)  
&运算符它既可以用于指针变量,也可用于非指针变量

  *——间接访问运算符 :访问 指针指向的变量
BinaryTreeNode s=*pTreeNode; (将 指针变量pTreeNode指向的变量k的值取出,并赋给s)
*n_pTreeNode 是 指向BinaryTreeNode类型的指针
注意:*运算符它只能用于指针类型的变量

  • 引用
用法: <数据类型> & <引用变量名> = <变量名>; 例如BinaryTreeNode &m3=k; (等号右边必须为变量)
定义:一个已定义变量的别名,操作引用类型的变量(别名)即操作这个已定义的变量,
引用类型的变量没有单独的存储空间,与被引用的变量使用同一空间;



(上图为 简化模型 m kn_pTreeNodepTreeNode 可能不连续 而且BinaryTreeNode 简化了)


  • 传值
将基本类型变量的值 拷贝 给 形参变量
  • 传址
将变量的地址 拷贝 给 形参变量 (个人认为传址 也是 一种特殊的 传值 只是是地址值而已)

  • 总结
指针和引用都是 传址   基本类型 都是传值
想通过 函数参数改变一个变量  必须通过这个变量的地址(它的引用或指向它的指针)  如果要修改的这个变量的类型是指针,这要通过 该指针的地址 即 指向该指针的指针

例如:
void Change(BinaryTreeNode  * pTreeNode,BinaryTreeNode & m){// 直接修改 传来的变量
	BinaryTreeNode j;
	j.m_nValue=90;
	pTreeNode=&j;
	
	m=j;
}

想要修改指针 pTreeNode 就必须 用它的地址 即指向 pTreeNode的指针n_pTreeNode
上面的代码中 pTreeNode指向的对象 不会改变 m被引用的变量 将 改变,是另一个了
( 他们分别修改的变量 分别是 指针变量pTreeNode 
和 基本变量m pTreeNode它指向的类型 )

void Change2(BinaryTreeNode  * pTreeNode,BinaryTreeNode & m){  //修改 传来变量的属性

	pTreeNode->m_nValue=555555;

	m.m_nValue=2000000;

}
上面的代码中pTreeNode指向的对象 将会被修改 m被引用的变量 将会被修改
( 他们分别修改的变量 分别是 指针变量pTreeNode它指向的类型 
和 基本变量m pTreeNode它指向的类型 )


  • 测试代码
指针.h文件
#include<iostream>
using namespace std;
struct BinaryTreeNode
{
	int  m_nValue;
	BinaryTreeNode  *  m_pLeft;
	BinaryTreeNode  *  m_pRight;
};

指针.cpp文件
#include"指针.h";
//定义变量:
BinaryTreeNode  * pTreeNode;
BinaryTreeNode  * * n_pTreeNode;
BinaryTreeNode    k;
BinaryTreeNode  & m=k;
void Change(BinaryTreeNode  * pTreeNode,BinaryTreeNode & m){// 直接修改 传来的变量
	BinaryTreeNode j;
	j.m_nValue=90;
	pTreeNode=&j;
	
	m=j;



	cout<<&j<<endl;
	//cout<<*j<<endl;    //编译出错  *运算符不能用于 结构体
	int i=0;
	cout<<&i<<endl;
	//cout<<*i<<endl;    //编译出错  *运算符不能用于 基本数据类型


}
void Change2(BinaryTreeNode  * pTreeNode,BinaryTreeNode & m){  //修改 传来变量的属性

	pTreeNode->m_nValue=555555;

	m.m_nValue=2000000;

}
void main(){
	k.m_nValue=5;
	//m=k;
	pTreeNode=&m;
	n_pTreeNode=&pTreeNode;
	BinaryTreeNode  s=*pTreeNode;
	cout<<s.m_nValue<<endl;
	cout<<pTreeNode->m_nValue<<endl;
	cout<<(*n_pTreeNode)->m_nValue<<endl;
	cout<<pTreeNode<<endl;
	cout<<*n_pTreeNode<<" 与上行应该相同"<<endl;
	cout<<&k<<" 与上行应该相同"<<endl;
	cout<<n_pTreeNode<<endl;

	BinaryTreeNode c2;
	c2.m_nValue=20;
	BinaryTreeNode & m1=c2;

	cout<<"初始值:"<<k.m_nValue<<endl;     //初始值5
	cout<<"初始值:"<<c2.m_nValue<<endl;   //初始值20
	cout<<&k<<" "<<pTreeNode<<"  相同则说明pTreeNode指向k  "<<endl;  //相同
	cout<<&c2<<" "<<&m1<<"  相同m1为c2的别名  "<<endl;               //相同
	Change(pTreeNode,m1);// 直接修改 传来的变量
	cout<<k.m_nValue<<" 是不是初始值5"<<endl;         //5   Change未改变k的值 
	cout<<c2.m_nValue<<" 是不是初始值20"<<endl;       //90  Change改变c2的值 
	cout<<pTreeNode->m_nValue<<" 是不是初始值5"<<endl;//5  Change未改变pTreeNode所指的对象
	cout<<&k<<" "<<pTreeNode<<"  相同则说明pTreeNode指向k  "<<endl;  //不相同
	cout<<&c2<<" "<<&m1<<"  相同m1为c2的别名  "<<endl;               //相同


	cout<<" --------------------------- "<<endl; 
	cout<<"初始值:"<<k.m_nValue<<endl;     //初始值5
	cout<<"初始值:"<<c2.m_nValue<<endl;   //初始值90
	cout<<&k<<" "<<pTreeNode<<"  相同则说明pTreeNode指向k  "<<endl;  //相同
	cout<<&c2<<" "<<&m1<<"  相同m1为c2的别名  "<<endl;               //相同
	Change2(pTreeNode,m1);//修改 传来变量的属性
	cout<<c2.m_nValue<<" 是不是初始值5"<<endl;                //2000000 Change2改变c2的值 
	cout<<k.m_nValue<<" 是不是初始值90"<<endl;                //555555  Change2改变k的值 
	cout<<&k<<" "<<pTreeNode<<"  相同则说明pTreeNode指向k  "<<endl;  //相同
	cout<<&c2<<" "<<&m1<<"  相同m1为c2的别名  "<<endl;               //相同
}







  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值