四.二数据类型(指针类型*)

张开发
2026/4/20 13:24:19 15 分钟阅读

分享文章

四.二数据类型(指针类型*)
目录1.计算机存储基本知识1.1CPU数据宽度1.2存储单元1.3地址总线位数1.4可寻址空间1.5内存地址2.指针变量2.1指针变量的定义2.2类型说明符2.3指针变量赋值3.对指针的操作4.函数之间地址值的传递4.1形参作指针变量时实参和形参之间的数据传递4.2通过传递地址值在被调用函数中直接改变调用函数中的变量的值4.3函数返回值指针函数1.计算机存储基本知识1.1CPU数据宽度CPU一次能处理的数据位数也就是数据总线的宽度。决定了CPU一次能从内存读取或写入多少位数据例如一次8位、16位、32位、64位。1.2存储单元内存中存储数据的最小可寻址单位现代计算机通常是1字节每个存储单元从存储单元到地址总线这样才通透而不是先规定了地址总线然后才有的存储单元。所以正确的逻辑应该是→先有的存储单元然后每个存储单元都有一个地址是都引出一条线但是都引出到地址总线则会混乱所以内部设计了一种电路地址译码器然后2的地址总线位数来表示1.3地址总线位数地址总线位数决定了存储单元的数量准确来说地址总线位数是决定了可以有几个地址1.4可寻址空间空间就是存储的大小不是代表可以表示具体数字的大小现代计算机下一个存储单元是一字节所以可寻址空间就是2的地址总线位数次方算出几个然后再乘以1字节而不是乘以2的八次方后面就没有了若不是一字节是两字节就乘以2若是1KB就乘以1然后单位改为1KB这里和那个次方平方没关系前面的2的地址总线的次方只是设计成这样CPU能直接访问的最大内存容量。最大可寻址空间2地址总线位数*每个地址单元的大小存储单元数*每个存储单元的大小在大多数架构中每个地址单元是1字节所以公式简化为最大可寻址空间2^地址总线位数字节1.5内存地址给上文提到的存储单元连续编排并从0x0000 000064位系统8位二进制开始增加命名前面的0x0000 0000 0000 0000就是内存地址变量的地址为该变量类型所占多个存储单元的首个存储单元的地址例如32位系统下int占4字节即四个存储单元int a的数据就存储在0x40000x4003之间那么变量a的地址为0x4000数组变量所占的存储单元数为数组元素变量类型*数组元素数。例如 int a【5】则变量a占用4*520个存储单元第一个元素所占四个存储单元中的第一个存储单元的编号即为数组a的地址。多个格子组合成一个盒子一般是八个格子大小为一字节可表示的值域为0256盒子进行排列下去根据排列机器人的能力CPU的数据宽度进行编排地址的大小。2.指针变量2.1指针变量的定义指针变量是存放一个内存地址的变量不同于其他类型变量它是专门用来存放内存地址的也称为地址变量。定义指针变量的一般形式为类型说明符 * 变量名2.2类型说明符类型说明符表示指针变量所指向变量的数据类型指针变量也是一个变量但是它的位宽值域大小与指向什么类型无关指针的位宽只取决于计算机的寻址能力32位还是64位解释指针变量存储的是地址地址的数字大小由CPU位宽决定若为64位则最大也只有0Xffff ffff ffff ffff64/88位二进制这也就是指针变量值域的由来2.3指针变量赋值指针变量只能通过取地址符pa 另一指针变量pq 标准函数malloc和calloc在内存中开辟动态存储单元进行赋值。pNULLp0表示为空指针而不是将地址0给到指针。3.对指针的操作指针运算是以指针变量所存放的地址量作为运算量而进行的运算。指针运算的实质就是地址的计算。指针运算的种类是有限的它只能进行赋值运算、算数运算和关系运算。若已定义int a; //定义一个int型的数据int *p; //定义一个指向int型数据的指针则对指针p有如下操作方式操作方式举例解释取地址pa;将数据a的首地址赋值给p取内容*p;取出指针指向的数据单元内的值加p;使指针向下移动1个数据宽度pp5;使指针向下移动5个数据宽度减p--;使指针向上移动1个数据宽度pp-5;使指针向上移动5个数据宽度指针移动的时候是跳过一个存储单元长度比如上方的int它的存储单元长度就是4B32位那么跳动的时候就是从0x4000→0x4004其中数组的移动如下int a[6]{1,2.3.4.5.6};a的长度是24字节int4字节*6个数a【0】a【】的长度是4字节inta本身就是可以视为一种指针但是指针指向数组的时候是指向第一个元素开始而不是整个24字节长的数组所以移动的时候是移动int的数据类型。两个指针相减运算 px-py运算的结果是两个指针指向的地址位置之间相隔数据的个数。 因此两个指针相减不是两个指针持有的地址值相减的结果。 两个指针相减的结果值不是地址量而是一个整数值表示两指针之间相隔数据的个数(不是两个十六级进制的地址相减)。主要就是区分px*px pxpx指针变量它的内容是地址量*px指针所指向的对象它的内容是数据px指针变量占用的存储区域的地址是一个常量4.函数之间地址值的传递4.1形参作指针变量时实参和形参之间的数据传递通过传送地址值可以在被调用函数中对调用函数中的变量进行引用即地址传递对比值传递形参和实参分别各自有自己的地址可以让主函数和子函数的数据进行隔离开来保证数据的安全。地址传递主函数和子函数使用的是同一套数据同一个变量避免了参数传递过程中的数据复制蹄盖了运行效率减少了内存占用。4.2通过传递地址值在被调用函数中直接改变调用函数中的变量的值值传递的方式要把数据从被调用函数返回到调用函数的唯一途径是通过return语句返回函数值这就限定了只能返回一个数据。但是利用地址传递的话就可以实现把两个或两个以上的数据从被调用函数返回调用函数。有时候函数不需要一个返回值或者说返回值无法解决问题例如比较得出一组数中最大的和最小的若利用传统的方式变量函数名则只能得到一个若直接地址传递 orderint *aint *b则可以直接将变量ab拿出来用4.3函数返回值指针函数将模块内的公有部分返回让主函数持有模块的“句柄”便于程序对指定对象的操作。

更多文章