个人总结
首先定义:
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; //相同
}