首页 > 其他分享 >初阶指针详解

初阶指针详解

时间:2023-09-25 13:31:42浏览次数:43  
标签:初阶 字节 int 地址 详解 内存 数组 指针

(目录)

1.内存和地址

在这里插入图片描述

  • 内存是电脑上特别重要的存储器,计算机中程序的运行都是在内存中进行的
  • 所以为了有效的使用内存,就把内存划分成一个个小块,这每一个小块被称为内存单元,每个内存单元的大小是1个字节
  • 为了能够有效的访问到内存的每个单元,就给内存单元进行了编号,这些编号被称为该内存单元的地址,地址在C语言中也被称为指针,所以以后就可以通过地址找到对应的内存单元

接下来创建一个变量aint a = 4int类型占四个字节,所以a在内存中占4个内存单元: 请添加图片描述 可以用&a进行取地址:&a,a是一个整形变量,占用4个字节,每个字节都有自己的地址,这里取出的地址是第一个字节的地址(较小的地址)

所以这里&a取出值的是0x0012ff44


2.指针变量的大小

通过一下代码就能得出指针变量的大小

#include <stdio.h>
int main()
{
  printf("%d\n", sizeof(char *));
  printf("%d\n", sizeof(short *));
  printf("%d\n", sizeof(int *));
  printf("%d\n", sizeof(double *));
  return 0;
}

结论:<font color="#dd0000">指针大小在32位平台是4个字节,64位平台是8个字节</font> 以上结论是根据程序结果得到的,接下来我们也可以通过物理层面去得到指针变量大小:

对于32位机器,它有着32根地址线,每跟线在寻址的时候会产生高电压和低电压也就是1或者0,有着32根地址线,也就是地址有着32歌比特位,1字节等于8比特,所以32位机器中地址占4个字节 这里我们可以继续算下去:32根地址线,就有2的32次方个地址,2^32Byte == 2^32/1024KB ==2^32/1024/1024MB==2^32/1024/1024/1024GB == 4GB,所以在32位机器中,可以给4G的空间进行编址。

这里我们就明白:

  • 在32位的机器上,地址是32个0或者1组成二进制序列,那地址就得用4个字节的空间来存储,所以一个指针变量的大小就应该是4个字节。
  • 那如果在64位机器上,如果有64个地址线,那一个指针变量的大小是8个字节,才能存放一个地址。

总结

  • 指针变量是用来存放地址的,地址是唯一标示一个内存单元的
  • 指针的大小在32位平台是4个字节,在64位平台是8个字节

3.指针类型的意义

指针有许多类型,如:int*,short*,char*,float*…… 但是从前面得知指针的类型都是4或8字节大小,它们不会存在像如intchar不同类型有着不同占用空间的问题,既然指针类型大小一样,那么为什么不把指针设置成一个同一类型的指针并且可以接收不同的类型变量的地址呢?不同的指针类型都有什么意义呢?

意义1:指针访问权限的大小

首先看一下代码:

#include <stdio.h>

int main()
{
	int a = 0x11223344;
	int* pa = &a;
	*pa = 0;
	return 0;
}

调试后进入内存窗口,找到a的地址后可以看见在内存中a中的存储的值为:44332211,这样“倒着存放”的原因是在Visual studio这个IDE中采取小端存储,如不懂大小端存储,

标签:初阶,字节,int,地址,详解,内存,数组,指针
From: https://blog.51cto.com/u_16237630/7595320

相关文章

  • 基础双指针算法:单队列、双队列
    1、单队列输入一串字符串,字符串有多个由单个逗号隔开的单词,任务是需要把单词间隔开,每个单词换行输出。输入样例abcdefghi输出样例abcdefghi#include<iostream>usingnamespacestd;constintN=1010;intmain(){charstr[N];#definegets(str)gets_s(str......
  • Java容器类详解
    Java的容器在Java中,我们想要保存对象可以使用很多种手段。最简单的就是数组。但是数组具有固定的尺寸,而通常来说,程序总是在运行时根据条件来创建对象,我们无法预知将要创建对象的个数以及类型,所以Java推出了容器类来解决这一问题。Java容器的基本概念Java容器类库是用来保存对象的,他......
  • 访问空指针出panic
    panic信息:<4>[1670581299]15:Failedonwritei2cdev=23(I2CDEV_RFSW0)<4>[1670581299]15:txretryfailed<4>[1670581299]15:Failedonwritei2cdev=23(I2CDEV_RFSW0)<1>[1670595592]4:CPU4Unabletohandlekernelpagingrequestatvir......
  • dxf格式详解与在线打开、查看
    dxf格式简介dxf是一种CAD文件格式,是AutoCAD使用的一种内部文件格式。它用于存储AutoCAD图形的几何形状、图层、样式、标注等元素。dxf文件格式是AutoCAD社区中使用最为广泛的文件格式之一,因为它是一种免费的文件格式,并且可以很好地支持AutoCAD的版本更新。dxf格式文件结......
  • stp格式详解与在线打开、查看
    stp格式简介stp(StandardfortheExchangeofProductmodeldata)文件是CAD绘图软件的3D图形文件的格式(扩展名),其中包含三维对象的数据;提供对产品模型数据交换的支持。stp文件是基于ASCII格式符合stp应用协议ISO10303-21标准的正文编码的交换结构的三维图像数据。stp格式数据组成s......
  • Shp格式详解与在线打开、查看
    Shp格式简介shp格式是一种矢量数据格式,用于存储地理信息系统(GIS)数据。shp文件由Esri公司开发,用于表示点、线和多边形等要素,并记录它们的坐标和属性信息。shp格式通常用于存储和共享各种类型的GIS数据,如地图、地形、人口数据等。Shp格式数据组成shp文件由一系列有序的文件组成,这些文......
  • Windows 安装Redis(图文详解)
    https://www.cnblogs.com/smile008/p/16676723.html Windows安装Redis(图文详解) 一、Redis是什么数据库?RemoteDictionaryServer(Redis)是一个开源的使用ANSIC语言编写、遵守BSD协议、支持网络、可基于内存、分布式、可选持久性的键值对(Key-Value)存储数据库,并提......
  • Java LinkedList与ArrayList源码解析:根本区别和表面区别的详解
    在Java中,LinkedList和ArrayList是两个常见的集合类。它们都实现了List接口,但它们在实现方式上有很大的区别。本篇博客将详细解析LinkedList和ArrayList的源码,解释它们的根本区别和表面区别,并提供详细的代码解释。LinkedList与ArrayList的根本区别:数据结构:LinkedList是基于链表......
  • Linux内核Makefile系统文件详解
    MakefileLinux内核的Makefile系统非常复杂,因为内核包含了许多不同的配置选项、架构和模块。以下是Linux内核Makefile系统中一些重要的文件和目录,以及它的作用。顶层Makefile(Makefile)顶层Makefile是整个内核编译过程的入口点它包含了全局选置选项,如目标体系结构、编译......
  • 简单而经典:Java中的冒泡排序算法详解
    当谈到简单的排序算法时,冒泡排序(BubbleSort)通常是其中之一。虽然它不是最高效的排序算法之一,但它的简单性和易于理解使它成为学习排序算法的良好起点。在本文中,我们将详细介绍Java中的冒泡排序。冒泡排序的基本原理冒泡排序(BubbleSort)是一种简单的排序算法,它通过多次遍历待排序的......