变量,指针,引用
变量
变量给一段可供程序操作的存储空间起了个名字,通过这个名字我们可以使用这个存储空间,使用变量就是使用内存空间,所以我们在声明变量时必须指定数据类型(指定这个存储空间为多大),但是可以不指定具体的数据内容,后面再填充进去也可以,因为我们可以通过这个变量随时操作这段存储空间。
int main() {
int a = 1;
cout << &a << endl;
cout << sizeof(a) << endl;
}
输出结果为:
0000009F54EFF544
4
通过对a使用&符号,可以获取这段存储空间(这段存储空间别名是a)的地址,对a进行sizeof(即对这段内存空间进行sizeof),可以获取这段内存空间的大小为四个字节(int为四字节)。
指针
- 和变量一样,通过指针可以对一段存储空间进行访问
- 指针本身就是一个对象,即它本身就占据一段存储空间,而不是像变量一样,只是一段存储空间的名字
- 指针可以像变量一样进行声明,同样在声明时可以不赋初始值,可以后面再让这个指针指向一段内存空间地址。
int main() {
int a = 1;
cout << "数据本身的地址:" << &a << endl;
cout << "数据本身的内存大小:" << sizeof(a) << endl;
int* point_a = &a;
cout << "指针本身的数据:" << point_a << endl;
cout << "指针本身的地址:" << &point_a << endl;
cout << "指针本身的内存大小:" << sizeof(point_a) << endl;
cout << "指针指向的数据:" << *point_a << endl;
cout << "指针指向的数据的地址:" << &(*point_a) << endl;
cout << "指针指向的数据的内存大小:" << sizeof(*point_a) << endl;
}
输出结果为:
数据本身的地址:000000393C11FC44
数据本身的内存大小:4
指针本身的数据:000000393C11FC44
指针本身的地址:000000393C11FC68
指针本身的内存大小:8
指针指向的数据:1
指针指向的数据的地址:000000393C11FC44
指针指向的数据的内存大小:4
从上面代码可以看到,指针本身就占据了内存,指针本身也有数据,数据内容就是指向的存储空间的地址,那么指针本身自然也有对应的内存地址。再64位编译模式下指针本身占据内存是8字节,32位模式下占据4字节,上面代码是再64位编译模式下编译的。
通过*可以对指针进行解引用,*加指针名称(*point_a)就相当于一个变量,可以直接使用它查看数据,对它使用&查看地址为多少,对它使用sizeof查看内存大小为多少。
引用
指针只是一段存储空间的别名,就像使用变量名那样,我们完全可以按照同样的方式使用一个引用。
int main() {
int a = 1;
cout << "数据本身的地址:" << &a << endl;
cout << "数据本身的内存大小:" << sizeof(a) << endl;
int* point_a = &a;
cout << "指针本身的数据:" << point_a << endl;
cout << "指针本身的地址:" << &point_a << endl;
cout << "指针本身的内存大小:" << sizeof(point_a) << endl;
cout << "指针指向的数据:" << *point_a << endl;
cout << "指针指向的数据的地址:" << &(*point_a) << endl;
cout << "指针指向的数据的内存大小:" << sizeof(*point_a) << endl;
int& ref_a = a;
cout << "引用本身的数据:" << ref_a << endl;
cout << "引用本身的地址:" << &ref_a << endl;
cout << "引用本身的内存大小:" << sizeof(ref_a) << endl;
}
输出结果为:
数据本身的地址:00000001000FFA04
数据本身的内存大小:4
指针本身的数据:00000001000FFA04
指针本身的地址:00000001000FFA28
指针本身的内存大小:8
指针指向的数据:1
指针指向的数据的地址:00000001000FFA04
指针指向的数据的内存大小:4
引用本身的数据:1
引用本身的地址:00000001000FFA04
引用本身的内存大小:4
从输出结果看到,我们使用引用和使用变量的效果是完全一样的,不管是直接使用ref_a,还是对ref_a使用&,还是对ref_a使用sizeof,都没有区别。