一、前言
相信很多学习C/C++编程都会“谈指针色变”。对于指针,是一种“指针虐我千百遍,我待指针如初恋”。因为一不小心,就会造成内存泄露,核心存储错误等BUG。今天本文就带大家走进指针。
二、什么是指针
指针(point),全称指针变量,简称为指针,是C/C++一个类型,其本质是一个变量,一个用来存放内存地址的变量。是一个复合类型。
** 三、为什么使用指针**
对于一个计算机程序,在存储数据的时候,需要考虑以下三个属性。
1.信息存储在什么地方(内存地址)?
2.存储的值是多少?
3.存储的是什么类型的信息?
为了解决上述的问题,就诞生了指针。
四、指针的基本用法
1.指针的声明、初始化以及赋值
C++是一个强类型语言并且严格区分初始化和赋值的概念。对于指针变量来说。声明指针的时候,必须要初始化,如果没有要指向的对象,可以指向nullptr。如下所示:
int x = 10; //初始化一个整形变量x
int* ptr = &x; //初始化指针变量,并且指向x
int* ptr2 = nullptr; //初始化指针变量,并且指向nullptr
从上面的代码可以看出,& 为取地址符号,目的是为了给指针变量赋值,int* 表示ptr为指针,且为一个int类型的指针。
2.指针的解引用
如果一个指针变量指向了一个对象,那么可以用解引用符号 * 来访问该对象存储的值。例如:
include <iostream>
int main() {
int x = 10;
int* ptr = &x;
std::cout << "*ptr = " << ptr << std::endl;
}
上述代码将会输出ptr的值为10。
3.指针的加减
指针作为一个变量,可以对其进行加减操作,需要注意的是,指针的加减,移动的是地址的长度。例如:一个int类型的指针,如果我们对其进行+1操作,那么它将会移动4个字节。如下所示:
include <iostream>
int main() {
int x = 10;
int* ptr = &x;
std::cout << "ptr = " << ptr << std::endl;
std::cout << "ptr + 1 = " << ptr + 1 << std::endl;
}
上述代码将会输出以下内容
ptr = 0x7ffd38e3b11c
ptr + 1 = 0x7ffd38e3b120
注意,并不是每一次运行结果都一样。
五、常量指针与指针常量
关于指针变量,请牢牢把握两个点:一个是指针变量指向的地址,而是指针变量指向地址中所保存的数据。
所谓指针指向的地址,只需要记住这一点,指针变量是用来保存变量地址的,而且是只能保存地址。所谓指针变量指向地址中保存的数据,即指向对象的值(注意是对象的值,而不是指针变量的值)
记住上面这两个,接下来将进入指针中相对比较重要的部分了
1.const int* ptr
const int* ptr表示指针变量ptr指向的地址中保存的数据不能改变,即变量的值不能改变,相当于 const int x =3;即 ptr不能改变。但是指针变量ptr指向的地址可改变。如代码第4行所示。
int x = 3;
int y = 4;
const int ptr = &x;
ptr = &y; //允许,可以指向不同的地址,但是不能修改地址中的值
*ptr = 5; //不允许,限定 ptr,保护地址中的数据
故,const int ptr 限制的指针的第二点,即限制指针变量指向地址中保存的数据,不能改变。
2.int* const ptr
int* const ptr 表示指针变量ptr指向的地址不能改变,即ptr的值不能改变,在下面这个例子中,指针变量只能指向x,不能指向y。但是指针变量指向地址中保存的数据可以改变,即ptr可以改变,如代码第4行所示。
int x = 3;
int y = 4;
int const ptr = &x;
ptr = 5; //允许,可以修改指针变量ptr指向地址中保存的数据
ptr = &y; //不允许,限定指针变量ptr指向的地址。
故,int const ptr限制的是指针的第一点,即指针变量指向的地址不能改变。
** 六、结语**
学习 C++ 的指针既简单又有趣。通过指针,可以简化一些 C++ 编程任务的执行,还有一些任务,如动态内存分配,没有指针是无法执行的。所以,想要成为一名优秀的 C++ 程序员,学习指针是很有必要的。
阿木实验室致力于为机器人研发提供开源软硬件工具和课程服务,让研发更高效!
网友评论