指针
指针是C++中一个非常重要的概念,它允许你直接操作内存地址,从而实现高效的内存管理和灵活的数据操作,是之后想要实现链表、树等复杂数据结构的基础.
指针是一个变量,它存储的是内存地址,而不是具体的值。通过指针,你可以访问或修改存储在该地址中的数据。
1. 对象和地址
在理解这个定义可能需要先理解一下一个简单的概念,就是对象。假设我们声明了两个变量n和x,分别是int和double,那么我们可以理解为由虚线构成的盒子表示类型,它是一个内部隐藏着各种性质的“设计图”,而由实线构成的盒子表示对象,它是基于设计图创建的实体。
而存储对象所用的地方便叫作内存空间。如果是一个有实体的空间,那么就有一个可以指向这个空间的数据用来找到这个空间所在的位置,而这个数据就叫做地址。其中&叫做取值运算符,在代码中的简单应用如例子所示:
// 显示对象的地址
#include <iostream>
using namespace std;
int main()
{
int n;
double x;
cout << "n的地址:" << &n << '\n';
cout << "x的地址:" << &x << '\n';
}
2.如何在代码中声明指针,调用指针
在C++中,我们是用这个格式来声明指针的:
int *ptr
//类型 *指针名;
那么ptr的值和*ptr的值都是什么呢?可以在下面的代码中找到答案:
#include <iostream>
using namespace std;
int main() {
int n = 135;
cout << "n : " << n << '\n';
cout << "&n : " << &n << "地址\n";
int* ptr = &n; // ptr指向n
cout << "ptr : " << ptr << "地址\n";
cout << "*ptr : " << *ptr << '\n';
return 0;
}
这样的代码,输出的结果见下图,ptr是一串地址,而*ptr就是n本身了,为什么会有这样的结果呢?我们可以看一下指针在计算机中是如何存储和调用的。
通过指针,我们可以间接地访问和修改变量的值,而不需要直接对变量进行操作。 这种机制是C++中指针的核心特性之一,广泛应用于动态内存管理、数据结构实现和函数参数传递等场景,可以见这个例子:
#include <iostream>
using namespace std;
int main() {
int x = 123, y = 567, sw;
cout << "x = " << x << '\n';
cout << "y = " << y << '\n';
cout << "修改值的变量[0:x / 1:y]:";
cin >> sw;
int* ptr;
if (sw == 0)
ptr = &x; // ptr指向x
else
ptr = &y; // ptr指向y
*ptr = 999; // 对ptr所指的对象赋值
cout << "x = " << x << '\n';
cout << "y = " << y << '\n';
return 0;
}
在这里,我们根据某些条件或用户输入,决定访问哪个对象或变量,这就叫做动态确定访问对象。 这种灵活性是通过指针实现的,因为指针可以在运行时指向不同的内存地址。
指针与变量各自的地址与值是怎么存储的呢?
假设我们这里有变量n,和指针*p,可以这样声明:
int n = 75;
int*p = &n;
其值和存储地址如图所示:
那么n的值就是75,n的地址是214,也就是&n是14,那么p的值就是214,p的地址是218,就是如下图所示: