776

阿木币

1

精华

1380 小时

在线时间

管理员

Rank: 9Rank: 9Rank: 9

发表于 2022-2-24 17:18:05 1276 浏览 0 回复

[杂言讨论] 技术分享 | C语言指针从入门到放肆

一、前言

相信很多学习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++ 程序员,学习指针是很有必要的。

阿木实验室致力于为机器人研发提供开源软硬件工具和课程服务,让研发更高效!

公众号:阿木实验室 ( 领取免费资料包)

官方淘宝店:阿木实验室(可购买硬件配件)

硬件咨询:yanyue199506(欢迎洽谈合作)

课程咨询:jiayue199506 (免费领取机器人工程师学习计划)

  • End-

技术发展的日新月异,阿木实验室将紧跟技术的脚步,不断把机器人行业最新的技术和硬件推荐给大家。看到经过我们培训的学员在技术上突飞猛进,是我们培训最大的价值。如果你在机器人行业,就请关注我们的公众号,我们将持续发布机器人行业最有价值的信息和技术。


扫一扫浏览分享
回复

使用道具 举报

返回列表
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表