引言
指针是C++中的一种特殊变量,用来存储另一个变量的内存地址。简单来说,指针并不直接存储数据本身,而是存储数据所在的地址。通过指针,我们可以直接访问和操作内存中的数据。指针在C++中至关重要,因为它们提供了对内存的直接控制,这使得程序可以更加高效和灵活。
什么是指针
指针的定义:存储内存地址的变量。实例代码如下
#include <iostream>
int main() {
int num = 42; // 定义一个整数变量num,值为42
int* ptr = &num // 定义一个指针变量ptr,并将num的地址赋给它
std::cout << "num的值: " << num << std::endl; // 输出num的值
std::cout << "ptr存储的地址: " << ptr << std::endl; // 输出指针ptr存储的地址(即num的地址)
std::cout << "ptr指向的值: " << *ptr << std::endl; // 解引用ptr,输出它指向的变量的值
return 0;
}
输出信息如下
num的值: 42
ptr存储的地址: 0x7ffee614c3c4 // 具体地址可能不同
ptr指向的值: 42
对上述代码的解释如下
- int num = 42; 这一行创建了一个名为num的整数变量,并将其值设置为42。
- int* ptr = &num 这一行创建了一个指向整数的指针ptr,并将num的内存地址赋值给它。&num操作符用于获取num的内存地址。
- std::cout << *ptr; 这一行使用解引用操作符*,通过指针ptr访问并输出num的值。
通过这个例子我们可以看到指针是如何存储地址的,并且是如何通过解引用来访问该地址存储的值。
指针的基本操作
指针可以简单的类比为浏览器中的里的书签。
浏览器代表内存中的数据,包含了许多信息(变量)。
书签是指针,它标记了某个具体页面的位置(内存地址)。
1.声明指针
就像你要新建一个书签,你得分类,告诉书签它收藏什么类型的信息。比如你可以这样:
int *ptr;
声明了一个int*类型的指针变量ptr。这就相当于你新建了书签放在了int类型文件夹:“嘿,你专门负责保存'int'类型的网页。
2.指向某个地址
书签得具体对应一个地址,要不然只能保存空白页面了。你得告诉它具体的网址:
int a = 10;
ptr = &a;
在变量前面加上&即为取该变量的地址,这里指针ptr就指向了变量a的地址。这里的'&a'就是具体的网址,相当于你给书签正式收藏了。
3.取值操作
书签存储的网页信息,当我想要浏览的时候,点击书签,“给我弹出你保存的信息吧,我要浏览了”。
int value = *ptr;
这里对一个指针变量前加上*就是解引用操作,能够将去指针变量指向的那块地址获取数据,这里value就获取了ptr指向的a的地址上保存的数据10。
4.修改指向的值
如果你觉得这个书签保存的页面不太对,你可以将其更新。
*ptr = 20;
这里就将ptr指向的a的地址上保存的数据由10变成了20。
5.修改指向
有时候如果书签保存的网页更新了,你需要修改一下指向,改成更新后的页面地址
int b = 60;
ptr = &b;
这里就更改了指针变量ptr的指向,如果此时输出*ptr的话,会输出ptr指向b地址上存放的数据60。
6.空指针
有些书签可能还没想好具体指向哪个页面,可以设置为空指针
ptr = nullptr;
当然个别页面可能已经失效 了,这时候就是悬空指针,地址已经被释放了,那就指向了非法地址。但大多数时候都是非常可靠的,只要你指挥得当,他就能高效地完成任务!
总结
本文我们具体介绍了一下指针的定义:存储内存地址的变量。其实完全可以将指针看做你的书签,目的就是存储具体页面的地址。有了这个地址我们可以直接访问和操作内存中的数据。这个意义是重大的,指针允许我们在运行时动态分配和释放内存,这在处理大量数据或需要灵活内存管理的场景中特别有用。允许程序员直接操作内存和硬件资源,避免了不必要的拷贝和数据移动。一些非线性的数据结构,如树,图,链表,就是利用指针这一关键变量来完成的。
好了,各位感谢大家读到了这里,希望本篇文章对您有所帮助,如果您感觉读了本篇对C++的理解又提升了,请给我点个赞吧,这对我真的很重要。