1.’&’运算符
int a = 5 ; int *p = &a; |
上面的代码“定义一个变量a,取得a的地址赋给指针p”,这是一个读取操作符,即用来读取变量的地址;表明:
1. &只是用来获取一个变量的地址,返回的是一个常量地址;
2. 因此“&变量”不能被赋值。
下面代码即是错误的:
int a = 5 ; int b = 10 ; int *p = &b ; &a = p; //“&a”不能被赋值。 |
2.’*’运算符
int *p; |
上面的代码“定义一个指针变量p,且该指针变量指向一个整型的变量”;这句话表明:
1. p是一个变量,表示地址;
2. *p也是一个变量,表示指向的变量;
#include "stdafx.h" #include <iostream.h>
int main(int argc, char* argv[]) { int a = 1 ; int b = 2;
int *p = &a; cout<<"变量a地址:"<<p<<endl; cout<<"指针p指向的变量:"<<*p<<endl; cout<<endl;
*p = 3; //指针p指向的变量可以改变 cout<<"指针p指向的变量改变后:"<<*p<<endl; cout<<endl;
p = &b; //指针p可以改变 cout<<"变量b地址:"<<p<<endl; cout<<"指针p指向的变量:"<<*p<<endl; cout<<endl;
return 0; } |
注意:
定义时int *p = &a;允许存在,等价于:
int a = 5 ; int *p; p = &a; |
其他地方不能出现*p = &a;类型不匹配
3.两者比较
下面的代码表明:
1. 定义时’*变量’、’&变量’只是起标记作用,指明后面的变量表示的含义,整体代表什么由后面的变量决定;即定义时’*变量’—>指针;’&变量’---->引用;
2. 使用时则’*变量’—>指针指向的变量;’&变量’---->变量所在的地址;
3. 引用的简要介绍(定义时使用&)
定义引用步骤:想要定义的数据类型,然后跟上引用运算符“&”,再跟上引用的名字(任何合法的变量名)。
其格式:类型 &变量名;
例如: int i=2;
int &j=i; //创建了一个整型引用
i和j是指向同一内存空间,j相当于i的别名。
注意:声明j是对整型的引用,初始化为引用i。在这里,要求i必须已经有声明或定义,而引用仅仅是它的别名,不能喧宾夺主。
①定义引用时,必须立即对它进行初始化,不能定义完成后再赋值。
如:int i=5;
int &j; //错误 !
j=i;
为引用提供的初始值,可以是一个变量或另一个引用。
例如:
int i=5;
int &j1=i;
int &j2=j1; //j1和j2都是i的别名。
②引用不可以重新赋值,不可使其作为另一个变量的别名。引用一旦初始化,它就维系在一定的目标上,再也不分开。任何对该引用的赋值,都是对引用所维系的目标的赋值。
#include "stdafx.h" #include <iostream.h>
void set1(int *p) { cout<<"指针p指向的地址:"<<p<<endl; cout<<"指针p指向的变量:"<<*p<<endl; cout<<endl; }
void set2(int &p) { cout<<"p指向的地址:"<<&p<<endl; cout<<"p代表的变量:"<<p<<endl; cout<<endl; }
void set3(int p) { cout<<"p指向的地址:"<<&p<<endl; cout<<"p代表的变量:"<<p<<endl; cout<<endl; }
int main(int argc, char* argv[]) { int a = 1 ; int b = 2;
set1(&a);
set2(b);
set3(b);
return 0; } |