《C和指针》(6)指针

1、内存和地址

  • 计算机的内存是由数以亿万计的位(bit)组成,每一个位可以容纳值01值。由于一个位所能表示的值的范围太有限,所以单独的位用处不大。通常许多为合成一组作为一个单位,这样就可以存储范围较大的值。
  • 下图展示了现实机器中的一些内存位置,这些位置的每一个都被称为 字节(byte ,每个字节都包含了存储一个字符所需要的位数。在现在的许多机器上 每一个字节包含8个位 ,可以存储无符号值0-255,或者有符号值-128--127
  • 之后为了存储更大的值,我们把两个或更多的字节合在一起作为一个更大的内存单位。例如,机器以字为单位存储整数 ,每一个字一般有24个字节组成。下面这个图所表示的内存位置以4个字节来表示。
  • 由于它们包含了更多的位,每一个字可以容纳无符号整数的范围是从0-4294967295(或者是 2 32 − 1 2^{32}-1 232−1),或者是有符号的范围(-21474836482147483647(或者说是 − 2 31 -2^{31} −231至 2 31 − 1 2^{31}-1 231−1))。
  • 注意:地址是最左边那个字节的位置还是最右边那个字节的位置,与计算机体系结构有关。还需要注意的硬件事项是边界对齐 ,在要求边界对齐的机器上,整型值存储的起始位置只能是某些特定的字节,通常是24的倍数。
  • 地址与内容
    • 这里有一个例子,上边的数字是内存地址,下边的是对应的内容。

    • 如果你记得这几个数的地址你就可以根据地址来用这些值,但是要记住地址太难了,地址有很多,很复杂,所以不切实际。所以可以通过名字而不是地址来访问内存的位置。如下图所示:

    • 有一点很重要,名字与内存位置之间的关联并不是硬件提供的,它是由编译器实现的。所以这些变量给了我们一种更方便的方法记住地址------------硬件仍然通过地址访问内存位置

2、值和类型

  • 现在让我们来看一下存储于这些位置的值。

    c 复制代码
    int a = 112,b = -1;
    float c = 3.14; //1078523331解释成浮点数为3.14
    int *d = &a; //变量a的地址是100,所以d为100
    float *e = &c; //变量c的地址是108,所以e为108
    • c声明的浮点型变量,但是在图中却是一个整数,为什么?
      原因:该变量包含了一系列内容为01的位,他们可以解释为整数 ,也可以被解释为浮点数 ,这取决于他们被使用的方式,如果使用的是整型算术指令,这个值就解释为整数,如果使用的浮点数类型的指令,就解释为浮点数。
    • 这个事实引出了一个重要的结论:不能简单的通过检查一个值的位来判断他的类型

3、指针变量的内容

  • 需要清楚以下变量对应的值

    c 复制代码
    int *d = &a; 
    float *e = &c; 
    
    /*通过上面的定义得到以下值*/
    &d = 112 // 变量d的地址
     d = 100 // 变量d的值、变量a的地址
    *d = 112 // 地址d中的内容、变量a的值
    
    &e = 116// 变量e的地址
     e = 108// 变量e的值、变量c的地址
    *e = 3.14// 地址e中的内容、变量e的值

4、间接访问操作符

  • 通过一个指针访问它所指向的地址的过程成为间接访问或解引用指针。这个用于执行间接访问的操作符是单目操作符*。下面是间接访问操作符的一些示例。

  • 可通过以下的箭头记法进行描述

5、未初始化和非法的指针

相关推荐
satan–01 分钟前
R语言的下载、安装及环境配置(Rstudio&VSCode)
开发语言·windows·vscode·r语言
电饭叔34 分钟前
《python语言程序设计》2018版第8章19题几何Rectangle2D类(下)-头疼的几何和数学
开发语言·python
Eternal-Student35 分钟前
everyday_question dq20240731
开发语言·arm开发·php
卑微求AC1 小时前
(C语言贪吃蛇)11.贪吃蛇方向移动和刷新界面一起实现面临的问题
c语言·开发语言
程序猿小D1 小时前
第二百六十七节 JPA教程 - JPA查询AND条件示例
java·开发语言·前端·数据库·windows·python·jpa
Yvemil71 小时前
RabbitMQ 入门到精通指南
开发语言·后端·ruby
潘多编程1 小时前
Java中的状态机实现:使用Spring State Machine管理复杂状态流转
java·开发语言·spring
冷静 包容2 小时前
C语言学习之 没有重复项数字的全排列
c语言·开发语言·学习
碳苯2 小时前
【rCore OS 开源操作系统】Rust 枚举与模式匹配
开发语言·人工智能·后端·rust·操作系统·os
结衣结衣.2 小时前
C++ 类和对象的初步介绍
java·开发语言·数据结构·c++·笔记·学习·算法