Loading

03-指针

指针的定义

  • 地址
    • 内存单元的编号(是一个从0开始的非负整数)
    • 地址值的范围:0~2^地址总线数 - 1
  • 指针
    • 数据类型:地址,存储地址这种类型的变量
    • 保存对象地址的变量,指针是一种"地址变量"。通常也叫"指针变量",统称"指针"
    • 指针变量就是存放内存单元编号的变量,或者说指针变量就是存放地址的变量
    • 本质:一个操作受限的非负整数

指针的重要性

  • 表示一些复杂的数据结构
  • 快速的传递数据
  • 使函数返回一个以上的值
  • 能直接访问硬件
  • 能够方便的处理字符串
  • 理解面向对象语言中引用的基础

Demo

简单使用

互换两个数


如何通过被调函数修改主调函数普通变量的值?

  1. 传递给形参的必须为该实参的地址
  2. 形参必须为指针变量
  3. 在被调函数中通过 *形参名 的方式就可以修改主调函数相关变量的值

* 的含义

  • 乘法
  • 定义[指针变量]
    • 实例:int* p;
    • 定义一个名字叫 p 的变量,其存放的内容必须是 int 类型变量的地址
  • 指针运算符
    • 实例:*p
    • 放在已经完成初始化操作的指针变量前面,等价于以 p 的内容为地址的变量

指针和数组

  • 指针和一维数组
    • 数组名
      • 就是一个地址 / 一个符号常量 / 一个地址常量
      • 数组名也属于符号常量。数组名这个符号,就代表了数组占的那块内存的首地址
      • 不是数组名这个符号的值是那块内存的首地址!而是数组名这个符号本身就代表了首地址这个地址值!它就是这个地址!
      • 不是一个变量,更不是一个作为变量的指针
  • 下标和指针的关系:pArr[i] 等价于 *(pArr+i)
  • 在一个函数内部修改 main 函数内定义的数组
    • 需要 2 个参数
      • 数组第一个元素的地址(数组名这个符号就代表了数组所占那块内存的首地址)
      • 数组的长度
    • 代码演示
  • 指针变量的运算
    • 指针变量不能相加、相乘、相除
    • 如果两个指针变量指向的是同一块连续空间中的不同存储单元,那么这两个指针变量相减有意义,其结果为两个指针指向元素之间相隔的元素数目

一个指针变量的大小

sizeof (数据类型 | 变量名):返回值就是该 [数据类型 | 变量] 所占的字节数

  • p 指向 char / int / double 类型变量,其所占的字节数是否一样?是一样的
  • p 只保存"所指向变量的首字节地址",但其本身却占用 4 个字节,为什么?以 32 位机为例,共有 2^32 个地址,而表达其中的某一个地址就需要 32 位 Bit,即 4 个字节
  • p 只保存了变量首字节的地址,那它如何获悉整个变量到底占用了多少字节?根据指针变量的数据类型。如 int* p = &i; 如此便知道了从首地址往后 sizeof(int) 个字节 都是 [p所指向变量] 所占用的内存空间
  • 小结
    • 一个指针变量无论所指向变量占几个字节,其本身只占 4 个字节
    • 一个变量的地址是使用该变量首字节的地址来表示

多级指针

  • *r 是以 r 的内容为地址的变量,即 q
  • **r 是以 *r(q) 的内容为地址的变量,即 p
  • ***r 是以 **r(p) 的内容为地址的变量,即 i
posted @ 2020-09-04 12:17  tree6x7  阅读(154)  评论(0编辑  收藏  举报