【C/C++教程】指针,指向何方?

简介: 一说到指针可能大家的心里

一说到指针

可能大家的心里

就不止一句mmp要讲了

各种***号让人欲罢不能

指来指去指到你怀疑人生

各种停止运行简直扎心

各种函数指针,数组指针

简直不能再骚

传说最难,还没有之一

那么,指针究竟为何物?

有那么难?难以上青天?

容我说一句

传说终究是传说

今天就来跟大家简单聊一聊



何为指针?

指针并不神秘,理解指针

我更推荐从本质上去理解


什么是指针?


一种数据类型

既然是数据类型

就跟int,float,double一样

可以用来定义变量


那么,这种类型的变量存的是什么?

内存地址

对,我们要时刻牢记这两点

指针是一种数据类型

这种类型的变量存的是内存地址

我觉得很多人不理解指针

无非就是,不理解内存地址

然后将值和址的关系搞混

所以,在这里有必要跟大家科普一下

内存地址的相关知识

简单来说,内存可以简化为下面的模型

当然,这只是为了方便说明问题

实际内存的划分还是蛮复杂的


内存是干嘛的?

单纯点,存数据的呗

内存是由很多很多比特位组成的呀

比特位是什么呢?二进制位嘛

通电时为1,不通电时为0

比如下面这个图


微信图片_20220420185401.png

上面就是一排过去的比特位

每个位只有两种状态0 or 1

那么,我们规定

一个字节=8个比特位

然后将内存中排列的比特位

按照字节来编号

于是,有了下面这张图


微信图片_20220420185415.png


于是,重点来了

这里的编号

其实就是我们上面说的内存地址

那么指针就是用来存这玩意儿的

(0x表示十六进制,再问自杀)

所以,数在内存中

就是这么存的呀


比如18二进制是‭00010010‬

就是像上面一样丢进内存的

(实际存储中,整数,

小数都有自己的一套方式,

比如整数是补码形式存的,

这里就不展开了。)

经过上面的简单叙述

相信大家对内存地址有了一定的了解

对于指针

我的建议还是抓住本质

指针是什么?一种变量类型

这种类型的变量存的是什么?

内存地址

至于教科书上那些

房子和地址什么的

忘了它吧......


理解地址和变量名的关系


先来看看一个例子吧

int a = 100;这是干什么呢?

定义一个int类型的变量

定义变量嘛,就是告诉系统妈妈

我要存一个整数100

你给分配一块内存出来

那好啊,内存分配出来了

但是怎么找到它呢?这个简单

直接通过变量名去找嘛

但是系统妈妈还给了一种方式

她还给了我们一个内存地址

比如下面的这个

微信图片_20220420185630.png


假如给我们的变量a的地址是0x77FFA,但是不对啊

int不是占4个字节吗?0x77FFA指向的内存空间

不是只有一个字节吗?

哎,起始地址嘛。为什么指针类型有int*,float*等等?

就是告诉你,我存的是一块内存区域的起始地址

这块区域有多大?取决于类型嘛


然后,int *p = &a;这又是干啥呢?

抓住两点,p是什么?指针类型的变量

p存的是什么?变量a的地址呀

于是乎,p便指向了变量a

(&a表示取a的内存地址,再问自杀)

于是,我们有下图:

微信图片_20220420185846.png


然后,我们就可以通过指针p来访问a了


*p = 99;这又是什么意思?

*和指针变量结合

就是访问指针变量指向的那块内存空间嘛

然后通过这种方式

我们就可以把99重新放进0x77FFA这块内存空间里

然后a的值就相应修改为了99

好了,通过上面的例子

我们了解到了指针的本质

其实对于什么指针数组,数组指针

函数指针等等

抓住其本质,多加练习也很容易明白


总之,最大的难点就是,区分

指针变量,和指针变量指向的那块内存



指针有何用


很简单粗暴的一个例子

外挂怎么做的

金钱肯定是变量存的吧

那你找到那个变量的地址

想怎么改就怎么改

呃......当然指针不是这么用的

当初学C的时候

也在烦,既然有变量名

为什么还要整个指针这蛋疼的玩意儿

后来遇到了数组

只需要数组名+下标就可以轻松访问数组中的某个元素

其实大家都知道,数组名+下标其实相当指针+偏移,

第一次感受到指针的威力

再后来遇到函数

传指针可以修改函数外的变量

不由得对指针的好感大增

再再后来学了数据结构

被结构体通过指针环环相连的美感彻底征服

在茫茫的内存大海中

是指针将我们相互连接起来

无论对象被new到了哪里


我总能找到你

这才是指针

相关文章
|
15天前
|
存储 编译器 Linux
【c++】类和对象(上)(类的定义格式、访问限定符、类域、类的实例化、对象的内存大小、this指针)
本文介绍了C++中的类和对象,包括类的概念、定义格式、访问限定符、类域、对象的创建及内存大小、以及this指针。通过示例代码详细解释了类的定义、成员函数和成员变量的作用,以及如何使用访问限定符控制成员的访问权限。此外,还讨论了对象的内存分配规则和this指针的使用场景,帮助读者深入理解面向对象编程的核心概念。
43 4
|
30天前
|
存储 安全 编译器
在 C++中,引用和指针的区别
在C++中,引用和指针都是用于间接访问对象的工具,但它们有显著区别。引用是对象的别名,必须在定义时初始化且不可重新绑定;指针是一个变量,可以指向不同对象,也可为空。引用更安全,指针更灵活。
|
1月前
|
算法 数据挖掘 Shell
「毅硕|生信教程」 micromamba:mamba的C++实现,超越conda
还在为生信软件的安装配置而烦恼?micromamba(micromamba是mamba包管理器的小型版本,采用C++实现,具有mamba的核心功能,且体积更小,可以脱离conda独立运行,更易于部署)帮你解决!
63 1
|
1月前
|
存储 C++
c++的指针完整教程
本文提供了一个全面的C++指针教程,包括指针的声明与初始化、访问指针指向的值、指针运算、指针与函数的关系、动态内存分配,以及不同类型指针(如一级指针、二级指针、整型指针、字符指针、数组指针、函数指针、成员指针、void指针)的介绍,还提到了不同位数机器上指针大小的差异。
42 1
|
1月前
|
存储 编译器 C语言
C++入门2——类与对象1(类的定义和this指针)
C++入门2——类与对象1(类的定义和this指针)
30 2
|
1月前
|
Linux C语言 C++
vsCode远程执行c和c++代码并操控linux服务器完整教程
这篇文章提供了一个完整的教程,介绍如何在Visual Studio Code中配置和使用插件来远程执行C和C++代码,并操控Linux服务器,包括安装VSCode、安装插件、配置插件、配置编译工具、升级glibc和编写代码进行调试的步骤。
265 0
vsCode远程执行c和c++代码并操控linux服务器完整教程
|
1月前
|
存储 安全 编译器
【C++】C++特性揭秘:引用与内联函数 | auto关键字与for循环 | 指针空值(一)
【C++】C++特性揭秘:引用与内联函数 | auto关键字与for循环 | 指针空值
|
1月前
|
存储 C++ 索引
C++函数指针详解
【10月更文挑战第3天】本文介绍了C++中的函数指针概念、定义与应用。函数指针是一种指向函数的特殊指针,其类型取决于函数的返回值与参数类型。定义函数指针需指定返回类型和参数列表,如 `int (*funcPtr)(int, int);`。通过赋值函数名给指针,即可调用该函数,支持两种调用格式:`(*funcPtr)(参数)` 和 `funcPtr(参数)`。函数指针还可作为参数传递给其他函数,增强程序灵活性。此外,也可创建函数指针数组,存储多个函数指针。
|
1月前
|
算法 C++
【算法】双指针+二分(C/C++
【算法】双指针+二分(C/C++
|
1月前
|
存储 编译器 程序员
【C++】C++特性揭秘:引用与内联函数 | auto关键字与for循环 | 指针空值(二)
【C++】C++特性揭秘:引用与内联函数 | auto关键字与for循环 | 指针空值