指针-Pointer

news2024/10/6 6:45:01

0.1 地址

(1)字节(Byte)

一个字节存储8位无符号数(1Byte = 8 bit),每个字节储存的数值范围为0-255

(2)内存

1G = 1024M 、1M = 1024K 、 1K = 1024Byte 、1Byte = 8 bit

(3)地址

在计算机中一个地址代表一个字节,比如:地址0x00到0x01的大小为一个字节

栈和堆知识点

0.2 变量的存储

 int a = 5  :在栈中定义了一个变量a,并且在内存中开辟了一个int类型大小的空间, 即4个字节。

在a的自己的那片空间里面存放数值5 ,把5转换成二进制,存到a的4个字节的空间 。


1.1 创建指针

(1)先定义后赋值

int *p;

p = &a;                                          可理解为类型为int *(整型的指针类型),变量名为p

(2)定义赋值一步完成

int *p = &a;                                                               

1.2 指针的存储

int a = 5 ;int *p = &a :&a 拿到 a 的首地址0x43c00060,然后把0x43c00060这个值存放到p的存储空间中(另一个地址)。0x43c00060的二进制:

01000011

11000000

00000000

01100000                                                               把变量a的地址赋给了指针变量p

1.3 创建多级指针

int **q;

q = &p;                                                  p本身也是一个指针变量,它的值为a的地址

二级指针只能用于存储一级指针变量的地址。即只能指向一级指针

代码如 int a = 5 ;int **q = &a 这在语法上是不被允许的,

n级指针同理,只能用于存储n-1级指针变量的地址。


2.1 解引用

*(解引用)的作用是引用指针指向的变量值,&(取地址)其实就是引用该变量的地址。

p = 6618636     *p = 5

q = 6618624     *q = 6618636     **q = 5            * 本质上就是访问存储的地址所存储的数据

a = 5     &a = 6618636    

p = 6618636     &p = 6618624                                                       ​ & 与 * 互为逆运算

2.2 指针运算

(1)指针 +- 整数

*p++ = 0;                                                                 先给p指向的地址赋值,再移动指针       

指针+1所移动的距离为指针步长

指针步长由指针数据类型决定,如int *p的指针步长为4 Byte

(2)指针 - 指针

&arr[9] - &arr[0];                                                                                      结果为9

指针减去相同类型的指针,得到的结果为相差的存储元素个数。

不同类型指针相减,系统报错。

(3)指针比较大小

实际是比较指针所存储地址的大小:*p >*q  等同于 &a >*q

注:标准规定,允许指向数组的指针与指向数组最后一个元素后面的那个内存位置的比较,

但是不与允许与指向第一个元素之前那个内存位置的指针进行比较。

如图,指针P1可以与指针P3进行比较,但不可与指针P2进行比较。

2.3 指针与数组

(1)数组地址与首元素地址

int  arr [10] ;

arr为首元素的地址,和&arr[0]是等价的。而&arr为这个数组的地址。

区别在于:arr+1移动4个字节&arr+1移动4*10个字节

(2)数组指针与指针数组

int *parr[3] = { &a, &b, &c};

int (*arrp ) [3] = { 1, 2, 3};                                        前者为指针数组,后者为数组指针

*parr[ 3 ]定义了一个数组元素为指针变量的数组

(*arrp)[ 3 ]定义了一个指针,该指针指向数组{1,2,3}的首元素地址。

关键在于进入括号的 * 将会和变量名一起变成指针,指向数组的地址。

(3)指针与数组的复杂声明

int arr1 [ 5 ];

int arr2 [ 5 ];

int arr3 [ 5 ];

int (*parr[3] ) [5] = { &arr1, &arr2, &arr3 }; 

定义了一个长度为3的数组parr,里面是三个指针变量。

每个指针变量各指向一个长度为5的整型数组。

int *parr[10] = {......};

int * (*arrp ) [10] = &parr;

定义了一个指针arrp,指向长度为10的数组,且该数组的元素均为指针变量。

数组、指针复合变量赋值的关键在于看最内层括号里的数据是指针还是数组。

声明的是指针变量则赋地址;数组赋元素。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1125282.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

谈谈你对spring boot 3.0的理解

谈谈你对spring boot 3.0的理解 一,Spring Boot 3.0 的兼容性 Spring Boot 3.0 在兼容性方面做出了很大的努力,以支持存量项目和老项目。尽管如此,仍需注意以下几点: Java 版本要求:Spring Boot 3.0 要求使用 Java 1…

高等数学啃书汇总重难点(五)定积分

最近都在忙着刷题,尤其是政治和英语也开始加量复习了,该系列断更了将近2个月~不过最近在刷题的时候又遇到一些瓶颈,因此回归基础来整理一下知史点~ 总的来说,虽然第五章也是重中之重,定理数量也很多,但&…

通过条件竞争实现内核提权

条件竞争漏洞(Race Condition Vulnerability)是一种在多线程或多进程并发执行时可能导致不正确行为或数据损坏的安全问题。这种漏洞通常发生在多个线程或进程试图访问和修改共享资源(如内存、文件、网络连接等)时,由于…

There are not enough slots available in the system to satisfy the 48 slots报错

文章目录 问题描述解决办法 问题描述 多核运行时出现这个错误,减少核数运行正常 解决办法 输出命令 vim ~/.bashrc添加 alias mpirunmpirun --oversubscribe执行命令 source ~/.bashrc解决。

imu预积分学习(更新中)

imu预积分学习(更新中) IMU预积分可以做什么? 以上面那个经典图片为例子,IMU可以通过六轴数据,拿到第i帧和第j帧之间的相对位姿,这样不就可以去用来添加约束了吗 但是有一个比较大的问题是: I…

电脑技巧:27个Office使用小技巧,值得收藏

目录 一、Word 二、EXCEL 三、附文:Word和Excel快捷键 我们中的绝大部分人都使用微软的Office,但是我们是否都了解如何能够最有效地使用它?我们在这里列举了一些关于使用Word和Excel的窍门。 我们使用最多的软件可能就是办公软件了——字…

C++数据结构X篇_19_排序基本概念及冒泡排序(重点是核心代码)

文章目录 1. 排序基本概念2. 冒泡排序2.1 核心代码2.2 冒泡排序代码2.3 查看冒泡排序的时间消耗2.4 冒泡排序改进版减小时间消耗 1. 排序基本概念 现实生活中排序很重要,例如:淘宝按条件搜索的结果展示等。 概念 排序是计算机内经常进行的一种操作,其目…

计算机网络(谢希仁)第八版课后题答案(第一章)

1.计算机网络可以向用户提供哪些服务 连通性:计算机网络使上网用户之间可以交换信息,好像这些用户的计算机都可以彼此直接连通一样。 共享:指资源共享。可以是信息、软件,也可以是硬件共享。 2.试简述分组交换的要点 采用了存储转发技术。把报文(要发…

Python 测试框架unittest和pytest的优劣

一、Unittest Unittest是Python标准库中自带的单元测试框架,Unittest有时候也被称为PyUnit,就像JUnit是Java语言的标准单元测试框架一样,Unittest则是Python语言的标准单元测试框架。 Unittest支持自动化测试,测试用例的初始化、…

【Chrome】使用k8s、docker部署无头浏览器Headless,Java调用示例

什么是无头浏览器? 无头浏览器是一种没有图形用户界面的浏览器。无头浏览器不通过其图形用户界面(GUI)控制浏览器的操作,而是使用命令行。 为什么要用Chrome无头? Chrome Headless用于抓取(谷歌)、测试(开发者)和黑客(黑客)。搜索引擎&…

【单元测试】--高级主题

一、模拟与存根深入 在单元测试中,模拟(Mock)和存根(Stub)是两种常用的测试替代品,用于模拟外部依赖或模拟特定行为,以便测试能够独立运行。以下是深入了解模拟与存根的概念,以NUni…

opencv dnn模块 示例(19) 目标检测 object_detection 之 yolox

文章目录 0、前言1、网络介绍1.1、输入1.2、Backbone主干网络1.3、Neck1.4、Prediction预测输出1.4.1、Decoupled Head解耦头1.4.2、Anchor-Free1.4.3、标签分配1.4.4、Loss计算 1.5、Yolox-s、l、m、x系列1.6、轻量级网络研究1.6.1、轻量级网络1.6.2、数据增强的优缺点 1.7、Y…

多态的使用以及多态底层的实现(下)

经过之前的学习我们知道了,继承能够实现多态的原理就是,在继承的父类和子类中各自存在一个虚表,父类和子类的虚表中各自储存了自己的虚函数,不同的点就是如果我们完成了虚函数的重写,那么子类(派生类&#…

【C++】继承 ⑧ ( 继承 + 组合 模式的类对象 构造函数 和 析构函数 调用规则 )

文章目录 一、继承 组合 模式的类对象 构造函数和析构函数调用规则1、场景说明2、调用规则 二、完整代码示例分析1、代码分析2、代码示例 一、继承 组合 模式的类对象 构造函数和析构函数调用规则 1、场景说明 如果一个类 既 继承了 基类 ,又 在类中 维护了一个 其它类型 的…

C指针 --- 初阶

目录 1. 指针是什么 2. 指针和指针类型 1. 指针 - 整数 2. 不同指针类型的解引用 3. 野指针 3.1. 野指针的形成原因: 1. 指针未初始化 2. 已释放的指针 3. 悬挂指针 3.2. 如何规避野指针 4. 指针运算 4.1. 指针 - 整数 4.2. 指针 - 指针 4.3. 指针的关…

C语言实现调整数组中奇数偶数顺序

目录 1.思路2. 代码 1.思路 给定两个下标left和right,left放在数组的起始位置,right放在数组中最后一个元素的位置循环进行一下操作 a. 如果left和right表示的区间[left, right]有效,进行b,否则结束循环 b. left从前往后找&#…

关于 硬盘

关于 硬盘 1. 机械硬盘1.1 基本概念1.2 工作原理1.3 寻址方式1.4 磁盘磁记录方式 2. 固态硬盘2.1 基本概念2.2 工作原理 1. 机械硬盘 1.1 基本概念 机械硬盘即是传统普通硬盘,硬盘的物理结构一般由磁头与盘片、电动机、主控芯片与排线等部件组成。 所有的数据都是…

网络拓扑图怎么画最好?

你们好,我的网工朋友。 好久没和你们聊拓扑图了,群里总是不乏有人问,拓扑图怎么设计,怎么配置,或者让大佬看看自己做的这图有没有啥问题的…… 画拓扑图的方式有很多,在线软件,Visio&#xff…

比例运算放大电路为什么要加平衡电阻

这个是反相比例运算放大电路,输出电压等于-Rf/R1乘以输入电压。 这个是同相比例运算放大电路,输出电压等于1Rf/R1乘以输入电压。 大家可以看到这两个电路中,都有一个电阻R2,反相比例运算放大电路放在同相端到地,同相比…

空间地图GIS基础

一、GIS基本概念 地理信息系统(Geographic Informaiton System, GIS)是一个可以建立、浏览、查询、分析地理空间数据的软件系统,其功能小至地图的展示,大至空间决策分析与支持。 1.GIS基础 (1)地理信息系统(GIS)的概念与组成 …