C/C++问题:一个指针的大小是多少?怎么理解指针变量的存在

news2025/7/12 7:41:40

目录

举例

一、

 int a;

int (*(*v)[])();

二、

int func();

int (*func)();

三、

const;

int const a;

const int a;

int const*r;

int *const r;

四、一个指针的大小是多少?(补充)


举例

一、

 int a;

 可以看到上面声明了一个变量,自然一眼就可以看懂;那下面这个呢??

 如果你被绕晕了,那我会教你一个有用的方法;按照这个方法你会读懂任何类型的声明

第一步:找到变量名

 第二步:向右看

 第三步:再次往左看

 第四步:如果有括号的话跳出一层括号

 第五步,重复上述过程,直到读出最终的类型。以上过程同时适用于变量函数的类型声明,

包括函数指针。学会了上面的过程,那让我们举一些具体的例子来操练一下吧

int *v[5];

 每个元素都是指向int的指针或者更符号汉语习惯的v是一个有5个指向int的指针的数组,那么加上括号又是个什么意思呢??

我们要先考虑括号内的声明 所以:

 

 V是一个指向有5个整数的数组的指针

现在让我们搞点比较复杂的东西,那就是下面这个

int (*(*v)[])();

 所以v是一个int型函数指针组成的数组,看明白这个你就知道怎么回答上面这个问题了。

 

所以完整的说就是:v是一个指向int 型函数指针组成的数组的指针

二、

下面让我们来看看函数指针

int func();

int func()是个函数声明,func();是个返回int型的函数

那么下面这个呢?

int (*func)();

int (*func)();

 

 所以func是个指针,指向一个返回int型的函数,这就是函数指针

三、

最后我们聊聊const

const;

   const是常量声明,意思是不能改变变量的值;const处在变量声明中不同位置的时候,效果是不一样的;很多在同学在学习的时候容易混淆

int const a;

最简单的int const a;等价于const int a;意思是a的值不能改变

 

加入指针的情况下会变得稍微复杂一点。

  所以r是一个指向const int的指针,*r不能改变;但是r本身不是const,所以可以改变。

const int a;

不能够改变的int型变量

int const*r;

你可以直接给r赋值,让它指向别的地方。

int *const r;

我们把const和*的位置互换一下,效果就又不一样了。

 指向int 意味着r的值本身不能够改变,同时也不能给r进行赋值;但是int没有const修饰

所以*r是可以改变的

四、一个指针的大小是多少?(补充)

    对于现在学c/c++的新人,经常碰到一个简单但容易犯错的问题

指针的大小是多少??

 不如换种说;一个指针在内存里面占多少个字节??

 举个例子  我们现在有三个指针,分别指向一个char 和double还有一个struct;这个struct里面还有一个char和一个长度为100的float的数组。

那么请问这三个指针的大小是多少??

 有些同学可能认为指针跟指向类型的大小是一样的,比如char指针和char一样是一个字节;double指针和double类型一样占8个字节;上面的struct占401个字节,那么指向它的指针也占401个字节,然而这只是一个错误的经典理解。其实不论在什么样的机器上,在同一个机器中。不管指向什么,指针的大小都是固定的,都是跟内存的地址一样长。为了去理解这个问题,我们需要知道

指针是什么?? 指针的本质就是内存的地址,所以一个内存地址有多长,一个指针就有多大


 这就是我们经常听到的两个概念;32bit架构和64bit架构,这是什么意思呢??

 

 计算机的内存是一块一块连续的区块,每个区块可以存放 1byte的的信息;

这些区块就像一些房子,我们可以给他们依次编号,这里需要注意的是,现在计算机内存的最小单位是一个字节而不是一个比特;1个字节等于8个比特

 那么给第一个地址编号0001,第二块编号0002;以此类推

 给第9999块编号9999,假如我们只用四位数记录地址;那么我们只能有9999块内存,换算成二进制,在32bit的机器中;我们使用32个比特来记录一块内存的地址;

  在64bit的机器中,我们使用64bit来记录一块内存的地址;因此32bit内存地址编号的最大值就是32bit的上限,也就是2的32次方;这个容量换算成我们熟悉的单位就是4GB;64bit的机器的内存地址编号的最大值也就是2的64次方;一共是17179869184G的内存。

考虑到现在的主流配置还是16GB,64bit的架构应该在很长一段时间都不会过时了;不会产生向新的向128bit升级的需求

 既然指针存储的是内存的地址,而内存的地址在32位架构上是4个字节;那么32位架构的指针就是4个字节。同理64bit架构的指针就是8个字节。


实际情况中,可执行程序是由编译器产生的二进制码,

因此指针的大小实际上是由编译器决定的。

     到这里就全部讲完了。 

                                                 完结撒花!!🎇🎇🎇

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

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

相关文章

【MySQL基础】SQL语言的概述、组成及特点

目录 一、SQL的概述 二、SQL语言的组成 三、SQL语言的特点 语法特点: 💟 创作不易,不妨点赞💚评论❤️收藏💙一下 一、SQL的概述 SQL全称: Structured Query Language,是结构化查询语言&am…

数据结构先序序列创建二叉树

2022.11.19连发两回。 先序序列创建二叉树任务描述相关知识编程要求测试说明C/C代码任务描述 本关任务:利用先序遍历创建二叉树,并给出相应二叉树的中序遍历结果。 相关知识 为了完成本关任务,你需要掌握:1.二叉树的前序遍历&a…

win11系统下,迅雷启动后闪退的问题

win11系统,迅雷最新版本。 之前用迅雷一直好好的,某天要下东西突然发现点击就闪退,进程管理器里一点痕迹都没有。 启动就闪退,没有一点点痕迹。 因为之前是win10系统,一直用的好好的,考虑是不是win11系统…

创建自己数据集全套流程

目录 1、准备自己具有的数据集 2、标注数据----json格式 3、标注数据转为分割图----voc格式 4、增广数据集 5、分训练集以及验证集 1、准备自己具有的数据集 注意:数据集必须是统一的后缀格式,jpg或者png 2、标注数据----json格式 采用labelme标注…

前后端分离项目(vue+springboot)集成pageoffice实现在线编辑office文件

前后端分离项目下使用PageOffice原理图 集成步骤 前端 vue 项目 在您Vue项目的根目录下index.html中引用后端项目根目录下pageoffice.js文件。例如&#xff1a; <script type"text/javascript" src"http://localhost:8081/samples-springboot-back/pageof…

gom传奇引擎无限蜂功能插件安装图文教程

无限蜂功能插件安装教程 1. 百度搜索无限蜂官网,下载功能插件程序&#xff0c;请下载最新版&#xff01;2. 下载无限蜂功能插件&#xff0c;到桌面&#xff0c;并进行解压&#xff0c;如下图所示。 3. 打开无限蜂功能插件控制台(?.?.?)&#xff0c;进行账号注册。 4. 注册成…

InnoDB之Undo log格式

1. 前言 InnoDB有两大日志模块&#xff0c;分别是redo log和undo log。为了避免磁盘随机写&#xff0c;InnoDB设计了redo log&#xff0c;数据写入时只写缓冲页和redo log&#xff0c;脏页由后台线程异步刷盘&#xff0c;哪怕系统崩溃也能根据redo log恢复数据。但是我们漏了一…

STC51单片机32——液晶1602显示

//用LCD循环右移显示字符 //开发板上的跳帽连接Vcc #include<reg51.h> //包含单片机寄存器的头文件 #include<intrins.h> //包含_nop_()函数定义的头文件 sbit EP2^7; //使能信号位&#xff0c;将E位定义为P2.7引脚 sbit RSP2^6; //寄存器选择位&#…

Js逆向教程-09常见的加密方式

作者&#xff1a;虚坏叔叔 博客&#xff1a;https://xuhss.com 早餐店不会开到晚上&#xff0c;想吃的人早就来了&#xff01;&#x1f604; Js逆向教程-09常见的加密方式 常见的加密方式 一、js逆向流程 抓包调试扣去js改写本地运行 二、常见的加密方式 2.1取盐校验 不可…

【考研复试】计算机相关专业面试英语自我介绍范文(一)

文章目录前言&#xff1a;1.第一段&#xff1a;打招呼寒暄2.第二段&#xff1a;自我介绍3.第三段&#xff1a;为什么要读研4.第四段&#xff1a;个人优势5.第五段&#xff1a;立flag前言&#xff1a; 英语面试第一件事情就是让考生做自我介绍&#xff0c;考官可以借此机会了解…

图片编辑软件怎样加文字内容?图片添加文字方法大分享

大家平时在分享自己拍摄的照片时&#xff0c;有些时候会不会觉得照片有点单调&#xff0c;想在上面添加一些文字来装饰图片呢&#xff1f;又或者是在日常生活中&#xff0c;不小心拍到朋友的搞怪表情&#xff0c;这时候要是加上一些有趣的文字&#xff0c;就可以免费获得一个表…

Design A Twitter

title: Notes of System Design No.04 —Design a Twitter description: ’ Design a Twitter ’ date: 2022-05-14 09:50:32 tags: 系统设计 categories: 系统设计 00.What is Twitter 注&#xff1a;TimeLine 就是按照时间顺序显示的信息流 01. Functional Requirements 1…

特征工程(六)—(1)利用PCA进行特征转换

(1)鸢尾花数据集的手动处理 PCA利用了协方差矩阵的特征值分解 过程如下&#xff1a; (1)创建数据集的协方差矩阵 (2)计算协方差矩阵的特征值 (3)保留前K个特征值(按照特征值降序排列) (4)要保留的特征向量转换新的数据点 1、加载鸢尾花数据集 import matplotlib as mpl # 解…

js实现瀑布流

我们浏览网站的时候尤其是图片网站&#xff0c;我们会发现大大小小的图片&#xff0c;紧密的排列在一起&#xff0c;就像瀑布一样看着非常舒服&#xff0c;虽然css可以通过cloums来指定&#xff0c; 像我们这次的图片项目用的就是css实现的&#xff0c;最后布局是用grid布局写的…

【Spring(一)】如何获取对象(Bean)

目录 一、前言 二、Spring的下载 三、快速入门 四、IOC&#xff08;控制反转&#xff09; 五、创建XML配置文件 六、获取Bean   1. 按类型来获取Bean   2. 按id来获取Bean   3. 按idclass来获取Bean   4. 默认的一种特殊方式获取Bean   5. 有关id的一些说明 相关文章 Serv…

cpu设计和实现(流水线上的第一条指令)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 读书的时候&#xff0c;《计算机组成原理》也看了&#xff0c;《计算机体系结构》也学了&#xff0c;老师也给我们讲了各种各样的流水线知识&#…

Spring框架笔记

Spring51. 什么是Spring框架1.1 spring的特点2. IOC2.1 什么是IOC2.2. 基于xml的IOC2.2.1 创建对象2.2.2 给创建的对象赋值2.2.2.1 使用setter方法注入2.2.2.2 使用构造方法注入2.3 基于注解IOC2.3.1 创建对象的注解2.3.2 依赖注入的注解2.3.3 添加包扫描2.3.3.1 添加包扫描多种…

小目标检测:基于切图检测的yolov5小目标训练

目前在目标检测方面有着众多的检测框架&#xff0c;比如两阶段的FasterRcnn、以及yolo系列的众多模型。yolo系列在实际中用的最多&#xff0c;一方面性能确实不错&#xff0c;另一方面具有着较多的改进型系列。今天我们主要使用的yolov5系列。具体原理过程就不多说了&#xff0…

数字化助力生产制造管理:家具行业管理系统

中国家具产业经过近 40 年的发展&#xff0c;占到世界家具生产 1 /4 强&#xff0c;是全球生产和出口第一大国&#xff0c;在世界上有着广泛的影响和关注。中国家具产业也是国民经济的重要支柱产业&#xff0c;2018 年总产值达到16 000 亿元&#xff0c;占中国 GDP 2%多。 然而…

数据库高级 IV

数据库高级 IV 二分查找算法 定义 二分查找也称折半查找&#xff08;Binary Search&#xff09;&#xff0c;它是一种效率较高的查找方法。但是&#xff0c;折半查找要求线性表必须采用顺序存储结构&#xff0c;而且表中元素按关键字有序排列前提要求:1. 线性表必须采用顺序存…