变量:其值可以改变的量
变量的作用:给一段指定的内存空间起名,方便操作这段内存
eg:
int a = 10;如图:
eg:
int x;
cout<<&x<<endl;
x = 10;
cout<<&x<<endl;输出结果如下:
故,声明a的时候a就以及分配了地址。
指针:指针指向变量的地址,其本身也有地址。即:指针从本质上讲是一个变量,变量的值是另一个变量的地址,指针在逻辑上是独立的,它可以被改变的,包括指针变量的值(所指向的地址)和指针变量的值对应的内存中的数据(所指向地址中所存放的数据)。
注意:指针定义必须初始化,不然就会产生野指针。
eg:
int a = 10;
int *p = &10; 如图:
p是新的内存空间的名称,他有一个地址0x0020,他指向变量a的地址的
eg:
int a=10;
int *p = &a;
cout<<"a的地址: "<<&a<<endl;
cout<<"p的地址: "<<&p<<endl;
cout<<"----------------------"<<endl;
cout<<"a的内容: "<<a<<endl;
cout<<"a的地址: "<<&a<<endl;
cout<<"p的内容: "<<p<<endl;
cout<<"----------------------"<<endl;
cout<<"a的内容: "<<a<<endl;
cout<<"p的内容是a的地址,则p的内容所指的内容为:"<<*p<<endl; 输出如下:
综上,我们可以总结出,每个指针都有自己独立的地址。指针的内容指向变量的地址。因此,如果在定义一个指针的时候没有给指针初始化,则会出现野指针。野指针不知道会访问到什么地址,很危险。
同理,二重指针就是指向其一重指针的地址。
eg:
int a = 10;
int *p1 = &a;
int **p2 = &p1;如图
eg:
int a = 10;
int *p1 = &a;
int **p2 = &p1;
cout<<"a的地址: "<<&a<<endl;
cout<<"p1的地址: "<<&p1<<endl;
cout<<"p2的地址:"<<&p2<<endl;
cout<<"----------------------"<<endl;
cout<<"a的内容: "<<a<<endl;
cout<<"a的地址: "<<&a<<endl;
cout<<"p1的内容: "<<p1<<endl;
cout<<"**********************"<<endl;
cout<<"p1的内容: "<<p1<<endl;
cout<<"p1的地址:"<<&p1<<endl;
cout<<"p2的内容: "<<p2<<endl;
cout<<"**********************"<<endl;
cout<<endl;
cout<<"a的内容: "<<a<<endl;
cout<<"p1的内容是a的地址,则p1的内容所指的内容为:"<<*p1<<endl;
cout<<"----------------------"<<endl;
cout<<"p1的内容:"<<p1<<endl;
cout<<"p2的内容是p1的地址,则通过p2取p1的内容为: "<<*p2<<endl;
cout<<"通过p2取到a的内容,则: "<<**p2<<endl;输出如下:
引用:引用从本质上讲是一个别名,是另一个变量的同义词,它在逻辑上不是独立的,它的存在具有依附性,所以引用必须在一开始就被初始化(先有这个变量,这个实物,这个实物才能有别名),而且其引用的对象在其整个生命周期中不能被改变,即自始至终只能依附于同一个变量(初始化的时候代表的是谁的别名,就一直是谁的别名,不能变)。引用没有独立的地址。
eg:
int a = 10;
int &b = a; 如图:
和变量的作用,一段指定的内存空间起名类似,引用好比他给这个名称又起了一个别名,好比给一个人取了一个小名。仅此而已。
eg:
int a = 10;
int &b = a;
cout<<"a的地址:"<<&a<<endl;
cout<<"b的地址: "<<&b<<endl;
cout<<"a的内容:"<<a<<endl;
cout<<"b的内容: "<<b<<endl; 输出如下:
不难发现,b简直跟a一毛一样,内存,内容完全都是一样的。所以完全可以把b当成a来进行操作。
以上,是个人整理的一些基础概念,有问题欢迎指出,一起学习共同进步,谢谢