首页 > 其他分享 >深入理解指针

深入理解指针

时间:2024-03-21 23:00:29浏览次数:20  
标签:const 字节 地址 理解 深入 内存 指针 变量

1、内存和地址

1.1内存

在生活中相当于一栋楼中房间号,在计算机中cpu,在处理数据时,需要的数据就是在内存中读取的,处理以后的数据也会放在内存中,内存会被划分成一个一个的内存单元,每个内存单元的大小取一个字节

一个比特位可以存储一个2进制的为1或0;

bit——比特位;Byte——字节;

1Byte=8bit;1kB=1024Byte;1MB=1024kB

其中,每个内存单元,相当于一个学生宿舍,一个字节空间里面能放8个比特位,每个内存单元也都有一个编号,我们可以理解为内存单元的编号==地址==指针

1.2理解编址

32位机器上有32根地址总线,每根线上只有两态,表示0,1,那么一根线就能表示两种含义,32根地址线就能表示2^32种含义,每种含义都表示一个地址,地址信息被下达给内存,在内存上就可以1找到该地址对应的数据,将数据在通过数据总线传入cpu内寄存器;计算机是有很多硬件单元的,硬件单元是要相互协同工作的,所谓的协同,至少相互之间要能够进行数据传递;通过“线”连接起来

控制总线传递的信息是是读还是写,如果读,首先从地址线上传输一个信号,告诉cpu要读取一个数据,地址信号通过地址线传输过去,通过地址信号找到内存单元,通过数据总线,再将数据传输过去

2、指针变量和地址

2.1取地址操作符

变量创建的本质是在内存中开辟了一块空间

25的四个字节每个字节都有自己对应的地址,那么当取地址时是拿的那个地址呢

拿的是第一个字节的地址,当知道第一个字节的地址,顺藤摸瓜,就会知道后面字节的地址

2.2指针变量和解引用操作符(*)

2.2.1指针变量

###

p是指针变量——存放地址的变量;int是在说明p指向的对象是int类型的,*是在说明p是指针变量;   

因此存放char类型的指针,要用char类型的指针     

2.2.2解引用操作符

###

   

*——解引用操作符(间接访问操作符),*p等价于a     

2.3指针变量的大小

* 在32位机器上,地址是32个二进制序列,存储起来需要32个比特位,也就是4个字节,指针变量的大小就是4个字节

* 在64位机器上,地址是64个二进制序列,存储起来需要64个比特位,也就是8个字节,指针变量的大小就是8个字节

*指针变量的大小和类型是无关的,只要是指针类型的变量,在同一个平台下,大小都是一样的

3.指针类型变量的意义

3.1指针的解引用

## 调试可以看到,第一个会将四个字节全部改为0,第二个只将第一个字节改为0;

指针类型决定了,对指针解引用的最大权限,如int*的指针解引用能访问四个字节,char*指针解引用只能访问一个字节

3.2指针加减整数

     

可以看出char*类型的指针变量+1跳过一个字节,int*类型的指针+1跳过了四个字节

指针的类型决定了指针向前或者向后走一步有多大 

3.3void*指针

 可以理解为无具体类型的指针(泛型指针),这种类型的指针可以用来接受任意类型的地址,但是不能进行指针的+-整数和解引用操作   

4.const修饰指针

变量是可以修改的,但是被const修饰后,在语法上加上了限制

如代码中对n进行修改,就不符合语法规则,报错

但是可以通过n的地址,修改n

可以看到确实被修改了,如过想要p拿到n的地址也不能修改,就应该用const修饰指针变量

4.1const修饰指针变量

测试const放在*的左边的情况

测试const放在*右边的情况

测试*左右两边都有const的情况

###

*const如果放在*的左边,修饰的是指针指向的zh内容,保证指针指向的内容不能通过指针来改变,但是指针变量本身的内容可变

*const如果放在*的右边,修饰的是指针变量本身,保证了指针变量的内容不能修改,但是指针指向的内容,可以通过指针改变

5.指针运算

5.1指针加减整数

5.2指针减指针

指针减指针的绝对值是指针和指针之间的元素个数(运算的前提条件两个指针指向同一片空间)

5.3指针的关系运算

两个指针是可以比较大小的,例如数组地址是从低到高的;

6.野指针

野指针就是指针指向的位置是不可知的(随机,不正确的)

6.1野指针的成因

6.1.1指针未初始化

6.1.2指针越界访问

6.1.3指针指向的空间释放

6.2.4如何规避野指针

指针初始化

小心指针越界

指针变量不再使用时,及时置NULL,指针使用之前检查有效性

避免返回局部变量的地址

7.指针的使用和传值调用

例如:写一个函数,交换两个整型变量的值,可能会写出如下代码:

没有发现交换的效果,这是为什么呢?

实参传递给形参的时候,形参会单独创建一份临时空间来接受实参,对形参的修改不影响实参

这个时候指针就派上用场了,通过交换函数里面地址间接操作,达到交换效果

将变量的指针传递给了函数1,这种函数调用方式叫:传址调用;

传址调⽤,可以让函数和主调函数之间建⽴真正的联系,在函数内部可以修改主调函数中的变量;所 以未来函数中只是需要主调函数中的变量值,就可以采⽤传值调⽤。如果函数内部要修改 主调函数中的变量的值,就需要传址调⽤。 

                                                                                               

标签:const,字节,地址,理解,深入,内存,指针,变量
From: https://blog.csdn.net/2402_82475148/article/details/136638845

相关文章

  • 非常不正经的鞅与停时定理理解
    鞅与停时计数题的小技巧,也许以后会更详细学一学,目前参考价值不高。直接看题目。例题:一共有\(n\timesm\)张卡,\(n\)种,每种各\(m\)个。手中维持有\(m\)张,知道初始的时候每一种牌有\(a_i\)个,每次随机一张扔掉,并且在牌堆中随机抽一张,然后把扔掉的牌插入牌堆。问多少次之......
  • C++ this指针
    1. this指针的用处一个对象的this指针并不是对象本身的一部分,不会影响sizeof(对象)的结果。this作用域是在类内部,当在类的非静态成员函数中访问类的非静态成员的时候,编译器会自动将对象本身的地址作为一个隐含参数传递给函数。也就是说,即使你没有写上this指针,编译器在编译的时......
  • 谈谈我对 AIGC 趋势下软件工程重塑的理解
    作者:陈鑫今天给大家带来的话题是AIGC趋势下的软件工程重塑。今天这个话题主要分为以下四大部分。第一部分是AI是否已经成为软件研发的必选项;第二部分是AI对于软件研发的挑战及智能化机会,第三部分是企业落地软件研发智能化的策略和路径,第四部分是我们现有的可采纳的、可落......
  • 深入理解并行编程-读书笔记 rcu
     在当前的Linux内核中发挥着重要的作用。RCU主要针对的数据对象是链表,目的是提高遍历读取数据的效率,为了达到目的使用RCU机制读取数据的时候不对链表进行耗时的加锁操作。这样在同一时间可以有多个线程同时读取该链表,并且允许一个线程对链表进行修改(修改的时候,需要加锁)。RCU适用......
  • OLAP数据库选型指南:Doris与ClickHouse的深入对比与分析
    码到三十五:个人主页心中有诗画,指尖舞代码,目光览世界,步履越千山,人间尽值得!在当今数据驱动的时代,数据的存储、处理和分析变得尤为重要。为了满足这一需求,市场上涌现出了许多优秀的数据处理和分析工具。其中,Doris和ClickHouse是两个备受关注的开源项目。本......
  • C语言(一级指针)
    指针本质:地址一级指针一级指针变量名:存储普通变量的地址格式:存储类型        数据类型        *指针变量名                                int                *pinta=5;int*p=&a;--------......
  • 如何理解23种设计模式?
    问题:如何理解23设计模式?我是一名python开发者,如何用简短的话语来介绍23设计模式?对我的开发有什么帮助吗?AI回答:设计模式是软件工程中的一套被广泛认可的解决特定问题的模板。它们是在多年的软件开发实践中总结出的有效方法。23种设计模式通常指的是《设计模式:可复用面向对象软......
  • 通俗理解自注意力机制
    自注意力机制(Self-AttentionMechanism)是一种用于处理序列数据的机制,最初被引入到神经网络模型中,用于在序列数据中建立全局依赖关系。自注意力机制最常用于自然语言处理和计算机视觉领域,特别是在Transformer模型中得到了广泛的应用。在自注意力机制中,对于输入的每一个元素,都......
  • 深入理解并行编程-学习笔记
    一简介1并行编程的目标并行编程(在单线程编程的目标之上)有如下三个主要目标。1.性能。2.生产率。3.通用性。线程优化:性能与扩展通用:需要牢记的是,并行编程只是提高性能的方案之一。其他熟知的方案按实现难度递增的顺序罗列如下。1.运行多个串行应用实例。2.利用现有的......
  • 深入理解 CSS:基础概念、注释、选择器及优先级
    在构建网页的过程中,我们不仅需要HTML来搭建骨架,还需要CSS来装扮我们的网页。那么,什么是CSS呢?本文将带大家了解css的基础概念,注释、选择器及优先级。一、CSS简介1.1什么是CSSCSS,全称为CascadingStyleSheets(层叠样式表),是一种用于描述网页上的信息格式化和显示方式的语言。它的......