一个指针占几个字节?原理是什么呢?

一个指针占几个字节?原理是什么呢?一个指针占几个字节的问题,感觉会C语言的同学都知道。但是在面试过程中,面了几个同学,不是答忘记了,就是两个、四个的瞎蒙。。。那么,一个指针到底占几个字节呢?其实,这个问题很简单,稍微上网一搜,你就知道:一个指针在64位的计算机上,占8个字节;一个指针在32位的计算机上,占4个字节。这么简单的问题,为什么面试官愿意问呢?其实这个问题不是在考你的记忆能力,是在考察你的计算机基础能力。就比如,…

大家好,又见面了,我是你们的朋友全栈君。

一个指针占几个字节的问题,感觉会C语言的同学都知道。但是在面试过程中,面了几个同学,不是答忘记了,就是两个、四个的瞎蒙。。。

那么,一个指针到底占几个字节呢?

其实,这个问题很简单,稍微上网一搜,你就知道:
一个指针在32位的计算机上,占4个字节;
一个指针在64位的计算机上,占8个字节。

这么简单的问题,为什么面试官愿意问呢?其实这个问题不是在考你的记忆能力,是在考察你的计算机基础能力。就比如,在你答出来4个字节的情况下,面试官会问一句:

为什么呢?

首先,我们要明白,指针就是地址,地址就是指针。 而地址是内存单元的编号。所以,一个指针占几个字节,等于是一个地址的内存单元编号有多长。
我们都知道,在计算机中,CPU不能直接与硬盘进行数据交换,CPU只能直接跟内存进行数据交换。而CPU是通过地址总线、数据总线、控制总线三条线与内存进行数据传输与操作。
在这里插入图片描述

问:假如,我们想通过CPU在内存中读取一个数字3,那么是怎样一个操作呢?

首先,CPU通过地址总线,在内存中找到数字3的地址;
然后,通过控制总线知道该操作是读还是写;
最后,通过数据总线,把数字3传输到CPU中。

我们可知道:
地址总线的宽度决定了CPU的寻址能力;
控制总线决定了CPU对其他控件的控制能力以及控制方式。
数据总线的宽度决定了CPU单次数据传输的传送量,也就是数据传输速度;

这是几种总线的类型以及简单功能。

我们平时所说的计算机是64位、32位、16位,指的是计算机CPU中通用寄存器一次性处理、传输、暂时存储的信息的最大长度。即CPU在单位时间内(同一时间)能一次处理的二进制数的位数。
假如,某计算机的地址总线是32位,那么其一次可以处理的信息是32条,每一条地址总线有0或1两种可能,那么32根地址总线一共有232种可能,也就是其描述的地址空间为0x0000 0000 0000 0000 ~ 232-1。
我们一般需要32个0或1的组合就可以找到内存中所有的地址,而32个0或1的组合,就是32个位,也就是4个字节的大小,因此,我们只需要4个字节就可以找到所有的数据。所以,在32位的计算机中,指针占4个字节。同理,在64位的计算机中,指针占8个字节。

同时也可以看出,由于地址总线为32,那么每次寻址的空间为0x0000 0000 0000 0000 ~ 232-1,那么CPU的最大内存为232Byte=222KB=212MB=22GB=4GB。
而64位,最大内存是264Byte。

更多学习关于指针变量占几个字节,请参考郝斌老师的C语言第P139集

看完视频的同学,可以看到老师讲的是:一个指针变量占几个字节
指针变量里面存放的是:某一类型的数据的第一个地址值。
也就是地址值占几个字节,指针变量就占几个字节
因此,
一个指针占几个字节
一个地址占几个字节
一个指针变量占几个字节
三种问法等同
不过,严谨些说,该题目改为 一个指针变量占几个字节 更为贴切些

举个例子

内存地址就像一条路上的门牌号,用几位表示需要看门牌数量。
门牌号从0号开始编排,到232-1号结束,一共就有232个门牌号。分别为二进制的
000000000000000000000000000号
000000000000000000000000001号
000000000000000000000000010号
最后
111111111111111111111111110号
111111111111111111111111111号
每个门牌的号码是32位(二进制),一个字节为8位,32位就是4字节。


其他知识点:

1位=1bit=1比特,表示一个二进制0或1

1字节(Byte) = 8位=8bit=8比特

数据存储是以“字节”(Byte)为单位,数据传输大多是以“位”(bit,又名“比特”)为单位,一个位就代表一个0或1(即二进制),每8个位(bit,简写为b)组成一个字节(Byte,简写为B),是最小一级的信息单位。

1个英文字母(不分大小写)占一个字节的空间

计算机能够处理的最小单元是 字节 而不是 位
位,是由软件通过位运算符操作的

指针和指针变量的区别

内存地址是内存单元的编号 ;
指针就是地址,地址就是指针;
指针变量就是存放地址的变量,也可以说,指针变量就是存放指针的变量
例如:
int *p中p就是指针变量。
需要注意:通常我们叙述时,会把指针变量简称为指针,实际上它们的含义并不一样

在这里插入图片描述

发现有些同学对地址、指针、指针变量还是分不太清,建议把郝斌老师的C语言有关指针的内容看一下,强烈安利。
没时间看的,可以把P123到P126这四节课看一下

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/153161.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长

相关推荐

  • c++钩子函数(react钩子函数)

    结合自定义消息映射方面,作为学习的一个总结.Step1:创建win32动态链接库(anemptyprojectDLL),命名为HookDLL1:增加一个类,命名为DLL.cpp2:增加头文件#include<windows.h>#include"DLL.h"3:创建全局变量#pragmadata_seg("Shared")HHOOKmHoo…

    2022年4月12日
  • java webservice实现_JAVA WebService的实现方式

    java webservice实现_JAVA WebService的实现方式WebService的实现方式:1.使用javajdkweb服务API实现2.使用CXF结合Spring一、使用JDKweb服务API方式①创建一个接口,使用@WebService()注解来指明该Java接口为WebService服务的接口②创建实现接口的实现类,同样使用@WebService(endpointInterface指明接入点接口)注解来指明该Java类为为WebServ…

    2022年7月13日
  • 游戏数据实时监控和分析[通俗易懂]

    游戏数据实时监控和分析[通俗易懂]概述为了更好的了解到游戏运行时的状态,对相关的功能和数据进行分析是很重要的,设计了本系统。现有的游戏数据大部分采用的是文本输出,备份,然后离线数据分析的方式,不能实时的监控的游戏的状态.相关技术:1:产生日志服务器采用c++实现2:日志监控服务器采用Java实现3:采用hadloop分布式架构.为应付大规模数据和实时的要求,尽快对数据进行分析4:存储日志采用mo

    2022年5月12日
  • scipy.interpolate.interp1d()函数详解

    scipy.interpolate.interp1d()函数详解插值模块scipy.interpolate是插值模块,插值是离散函数逼近的重要方法,利用它可通过函数在有限个点处的取值状况,估算出函数在其他点处的近似值。与拟合不同的是,要求曲线通过所有的已知数据。计算插值有两种基本的方法:对一个完整的数据集去拟合一个函数;仿样内插法:对数据集的不同部分拟合出不同的函数,而函数之间的曲线平滑对接。SciPy的interpolate模块提供了许多对数…

    2022年6月9日
  • CTK插件框架学习3-第一个插件编写

    CTK插件框架学习3-第一个插件编写前两章把CTK插件库编译好了,这里篇编写一个插件试一下,共需要创建两个小工程,一个是插件库,一个是测试程序。1.插件库编写1.1创建工程打开Qtcreator,新建一个EmputyqmakeProject,并给工程命名为ctk-plugin-first。Kits选择”DesktopQt5.12.3MSVC201764bit”。更改ctk-plugin-first.pro文…

    2022年5月18日
  • 操作系统知识点整理(完整版)

    操作系统知识点整理(完整版)第一章操作系统概述1)一个完整的计算机系统是由硬件系统和软件系统两大部分组成2)计算机软件是指程序和与程序相关的文档的集合3)按功能可把软件分为“系统软件”和“应用软件”两部分系统软件:操作系统语言处理程序,数据库管理系统应用软件:各种管理软件,用于工程计算的软件包,辅助设计软件4)通常把未配置任何软件的计算机称为“裸机”5)操作系统可以被看作是计算机系统的核心,统管…

    2022年6月25日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号