首页 > 编程语言 >C++最强功能之一指针

C++最强功能之一指针

时间:2024-09-11 15:20:59浏览次数:12  
标签:存储 缓存 C++ 访问 内存 最强 指针

最是人间留不住,朱颜辞镜花辞树。

                                                       ——《蝶恋花 ·阅尽天涯离别苦》【清】王国维

今天我们来说一说这个C++区别其他语言最明显的功能,指针。C++的指针可以说是功能强大,很多游戏的外挂中核心就是指针。

小知识:

计算机体系中的存储层次是指将不同速度、容量和成本的存储设备按照一定顺序组合起来,以满足计算机对数据处理和存储的需求。这种层次结构的设计旨在优化存储系统的性能,同时考虑成本效益。以下是对计算机体系中存储层次的详细解析:

一、存储层次的基本概念

存储层次是在计算机体系结构下存储系统层次结构的排列顺序。每一层相对于下一层都拥有较高的速度和较低的延迟性,但容量较小。这种设计使得计算机能够高效地利用存储资源,同时降低总体成本。

二、存储层次的组成

一般来说,计算机体系中的存储层次可以分为以下几层:

  1. CPU寄存器
    • 特点:速度最快,容量最小,直接参与CPU的运算。
    • 作用:用于暂存指令、数据和地址,以减少对内存的访问次数。
  2. 高速缓存(Cache)
    • 特点:速度较快,容量较小,位于CPU和主存之间。
    • 作用:作为主存的缓冲,存储CPU近期可能访问的数据和指令,以减少CPU对主存的访问延迟。
    • 类型:包括一级缓存(L1 Cache)、二级缓存(L2 Cache)等,有的处理器还包含三级缓存(L3 Cache)。
  3. 主存(内存)
    • 特点:速度适中,容量较大,是CPU和外存之间的桥梁。
    • 作用:用于存放当前正在运行的程序和数据,供CPU直接访问。
    • 类型:主要由DRAM(动态随机存取存储器)组成,也有部分使用SRAM(静态随机存取存储器)作为高速缓存。
  4. 辅助存储器(外存)
    • 特点:速度慢,容量大,成本低。
    • 作用:用于长期存储大量数据和程序,当需要时再将数据调入主存。
    • 类型:包括硬盘、固态硬盘(SSD)、光盘、磁带等。
三、存储层次的工作原理
  • 局部性原理:程序的执行具有局部性,即程序在一段时间内会集中访问某个区域的数据和指令。这是存储层次结构设计的基础。
  • 缓存机制:高速缓存利用局部性原理,预先将CPU可能访问的数据和指令从主存调入缓存,以提高访问速度。当CPU访问数据时,首先会在缓存中查找,如果命中则直接访问缓存;如果未命中,则访问主存并可能将数据调入缓存。
  • 虚拟存储:在主存和辅存之间形成虚拟存储系统,通过地址映射和页面置换等技术,实现大容量存储空间的透明访问。
四、存储层次的性能优化
  • 缓存替换策略:如LRU(最近最少使用)算法、FIFO(先进先出)算法等,用于优化缓存中的数据替换,提高缓存命中率。
  • 交叉编址:通过多体交叉编址技术提高主存的访存速度。

磁盘调度算法:如SCAN(电梯算法)、C-SCAN(循环扫描算法)等,用于优化磁盘的访问顺序,减少寻道时间和旋转延迟。


正文:

C++指针和其它语言的区别:

1.抽象级别:C++的指针提供了相对较低级别的内存访问能力,允许程序员直接管理和操作内存地址。而其他一些高级编程语言(如Java、Python)则可能使用引用或类似的机制来抽象指针的概念,不允许或限制直接访问内存地址。
2.安全性:由于C++指针提供了直接访问内存的能力,因此也带来了更高的安全风险,如野指针、内存泄漏等问题。而其他编程语言通过抽象指针概念,提供了更高的内存安全性。
3.语法和用法:C++的指针具有特定的语法和用法,如指针声明、指针运算等。而其他编程语言的“指针”或类似机制可能有不同的语法和用法。
总的来说,C++的指针与其他编程语言的指针或类似机制在抽象级别、安全性和语法用法上存在差异。这些差异反映了不同编程语言在设计哲学和用途上的不同考虑。

指针地作用

1.直接访问内存:通过指针,可以直接访问和修改内存中的数据,这为程序员提供了灵活的数据操作能力。
2.实现动态内存管理:C++指针与动态内存分配函数(如new和delete)配合使用,可以实现动态内存管理,即在程序运行时根据需要分配和释放内存。
3.传递数据的高效方式:通过传递指针,可以避免复制大型数据结构,从而提高程序的运行效率。
支持数组和字符串的操作:C++指针可以方便地用于遍历和操作数组和字符串。
4.实现函数回调和事件处理:指针可以用于指向函数,从而实现回调函数和事件处理机制。

指针基础:

内存是由很多内存单元组成的。这些内存单元用于存放各种类型的数据。

计算机对内存的每一个内存单元都进行了编号,这个编号就称为内存地址,内存地址决定了内存单元在内存中的位置。

这些编号通常很长,所以要记住它们很不容易,所以C++语言的编译器让我们通过名字来访问这些内存位置(就是变量名)。

指针定义的基本形式:指针本身就是一个变量,其符合变量的定义地基本形式,只不过它存储的是一个变量的地址。一个指针就只能存储一个变量的地址。

如:int a=110,b=-1;

double c=3.14;

int*d=&a;

double*e=&c;

通过一个指针访问它所指向的地址的过程称为间接访问或者是引用指针;这个用于执行间接访问的操作符是单目运算符*(只需要一个操作数。)

如:cout<<"a的地址"<<d<<endl ;  cout<<"变量a"<<*d<<endl;

这就是简单的指针表示,如果输出的d,那么就会得到a的地址,如果输出的是*d那么就会得到的变量a。

代码演示:
include<iostream>
using namespace std;

int main()
{
int a=110;

double c=6.1211;

int*d=&a;

double*e=&c;

cout<<"a的地址"<<d<<endl; 

cout<<"变量a"<<*d<<endl;

cout<<"c的地址"<<e<<endl; 

cout<<"变量c"<<*e<<endl;
return 0;
}

大家可以自己试一试,在自己的编译器上使用断点可以更好的看到代码内部的变化,加强自己的理解。

这里我提醒一点:我们在利用断点在监视器上观察代码,我们会发现指针也是有地址的,也就说指针也是有地址的,且会存储其他变量的地址。


标签:存储,缓存,C++,访问,内存,最强,指针
From: https://blog.csdn.net/2301_81280642/article/details/142027558

相关文章

  • C++ 不要将有符号整数和无符号整数相加
    一有符号整数和无符号整数相加时,把负数转换成无符号数类似于直接给无符号数赋一个负值,结果等于这个负数加上无符号数的模。unsignedintn=300;intm=-500;cout<<m+m<<'\n';cout<<n+m<<'\n';输出:-1000//正确4294967096//错误结果做个类型......
  • 南沙C++信奥老师解一本通题:1203:扩号匹配问题
    ​【题目描述】在某个字符串(长度不超过100)中有左括号、右括号和大小写字母;规定(与常见的算数式子一样)任何一个左括号都从内到外与在它右边且距离最近的右括号匹配。写一个程序,找到无法匹配的左括号和右括号,输出原来字符串,并在下一行标出不能匹配的括号。不能匹配的左括号用"$"标......
  • C++题目收集2
    这是本专栏的的第二篇收录集,我们一起来看一看那些有意思的题目,拓宽自己的思路。本期的题目有一些难,所以数目少一点。题目一:约瑟夫环#include<iostream>#include<vector>intjosephus(intn,intm){std::vector<int>people(n);for(inti=0;i<n;++i)......
  • 《C++ Primer Plus》学习day3
    C++11新增的内容:char16_t和char32_tchar16_t:无符号,16位,使用前缀u表示char_16字符常量和字符串常量;char32_t:无符号,32位,使用前缀U表示char32_t常量浮点类型C++有三种浮点类型:float、double、longdouble头文件cfloat中对对浮点数进行了限制:比如最低有效位......
  • C++入门 一(命名空间,缺省参数,超详细!!!)
    文章目录C++与C语言的区别命名空间(Namespace)缺省参数C++与C语言的区别C++在保留了C语言所有特性的基础上增加了面向对象编程的支持,并引入了更多的高级特性和工具来提高代码的可读性、可维护性和可扩展性。而C语言则更加简洁和底层,适用于对性能要求极高或对内存管理......
  • 智能指针
    C++智能指针解析为什么需要智能指针众所周知,Java和C/C++中间隔着一堵由内存动态分配和垃圾回收机制所围成的墙。java大佬们经常吐槽C++没有垃圾回收(GabageCollector)机制,而C++爱好者也经常攻击Java限制太死,不够灵活。其实Java并不是最早实践内存动态分配和垃圾自......
  • 指针
    内存就是计算机的存储空间,用于存储程序的指令、数据和状态。在C语言中,内存被组织成一系列的字节,每个字节都有一个唯一的地址。程序中的变量和数据结构存储在这些字节中。根据变量的类型和作用域,内存分为几个区域,如栈(stack)、堆(heap)和全局/静态存储区。内存编址计算机的内存是一......
  • c++引用
    c++指针和引用的区别指针和引用在C++中都用于间接访问变量,但它们有一些区别:指针是一个变量,它保存了另一个变量的内存地址;引用是另一个变量的别名,与原变量共享内存地址。指针(除指针常量)可以被重新赋值,指向不同的变量;引用在初始化后不能更改,始终指向同一个变量。指针可以为......
  • LeetCode算法—双指针
    一:普通双指针1、题目1:两数求和-1(1)方法1:普通双指针思路:定义两个指针;第一个指针放在数组的首位;第二个指针放在下一个元素的位置;然后遍历这个;如果两个元素的和为目标值就返回对对应的下标和索引值!deffuc(nums,target):foriinrange(len(nums)):forjinrange(i......
  • C++入门知识
    命名空间为什么会有命名空间?解决C语言中命名冲突的问题。(std是所有c++库的命名空间)解决方法:采用域作用限定符(::):指定编译器搜索的位置。编译器默认的搜索顺序:先局部再全局。命名空间域大体有4种域:全局域、局部域、命名空间域、类域。命名空间域的特点:1.不会影响生命......