【C语言】深入理解指针(2)

目录

一、数组名的理解

二、使用指针访问数组

三、一维数组传参的本质

四、二级指针

五、指针数组

1.指针数据的介绍

2.指针数组模拟二维数组


一、数组名的理解

数组名本来就是地址,而且是数组首元素的地址,这也是为什么在打印时不用&的原因

但是有两个例外

  • sizeof(数组名),sizeof中单独放数组名,这里的数组名表示整个数组,计算的是整个数组的大小, 单位是字节
  • &数组名,这里的数组名表示整个数组,取出的是整个数组的地址(整个数组的地址和数组首元素的地址是有区别的)

除此之外,任何地方使用数组名,数组名都表示首元素的地址

二、使用指针访问数组

有 **"除了sizeof(数组名)和&数组名外数组名就是数组首元素的地址"**这一概念后就可以使用指针对数组进行操作了

一些冷门知识

  • arr[i] == i[arr]

三、一维数组传参的本质

  • 数组名是数组首元素的地址,那么在数组传参的时候,传递的是数组名
  • 数组传参本质上传递的是数组首元素的地址(即形参可以写成数组形式,但本质上还是指针变量)
  • 所以函数形参的部分理论上应该使用指针变量来接收首元素的地址,而且形参和实参实际上使用的是同一块空间

补充说明

  • 第一个参数也可以写成 int arr[] 或 int arr[5] ,本质上传递的都是数组首元素的地址
  • 形参和实参操作的都是同一个数组,所以数组大小可以省略
  • 因为传递的是数组首元素的大小,所以sizeof(arr)算得的是地址的大小,在x86环境下是4字节,在x64环境下是8字节,所以函数内使用 sizeof(arr) / sizeof(arr[0]) 无法得到正确的值,最好在函数外提前求得数组大小,然后作为参数传递进来

四、二级指针

指针变量也是变量,在虚拟内存中也有自己的地址,同样也可以使用二级指针变量存储一级指针变量的地址

五、指针数组

1.指针数组的介绍

整型数组是存放整型的数组,字符数组是存放字符的数组

指针数组是存放指针的数组

  • 指针数组的变量类型是指针变量
  • 指针数组的每个元素都是用来存放地址(指针)的

2.指针数组模拟二维数组

parr[i]是访问parr数组的元素,parr[i]找到的数组元素指向了整型一维数组,parr[i][j]就是整型⼀维数组中的元素。

上述的代码模拟出二维数组的效果,实际上并非完全是二维数组,因为不同行之间是不同的数组,每一个数组内的地址是连续的,但是数组与数组间的地址并非是连续的

相关推荐
人道领域2 分钟前
【零基础学java】(等待唤醒机制,线程池补充)
java·开发语言·jvm
智算菩萨5 分钟前
【Python自然语言处理】基于NLTK库的英文文本词频统计系统实现原理及应用
开发语言·python·自然语言处理
superman超哥8 分钟前
Rust 异步并发核心:tokio::spawn 与任务派发机制深度解析
开发语言·rust·编程语言·rust异步并发核心·rust任务派发机制
喵星人工作室9 分钟前
C++传说:神明之剑0.2.1
开发语言·c++·游戏
黎雁·泠崖10 分钟前
Java入门之吃透基础语法:注释+关键字+字面量+变量全解析
java·开发语言·intellij-idea·intellij idea
Ashley_Amanda12 分钟前
Python 常见问题梳理
开发语言·windows·python
UpgradeLink15 分钟前
基于 Go 打造的升级链路管理平台:upgradelink 让设备升级更简单
开发语言·后端·golang
天府之绝17 分钟前
uniapp 中使用uview表单验证时,自定义扩展的表单,在改变时无法触发表单验证处理;
开发语言·前端·javascript·vue.js·uni-app
萧鼎27 分钟前
深入解析 Python 的 Word 模板引擎:docxtpl 全面指南
开发语言·python·word
Chan1628 分钟前
场景题:如何设计一个分布式ID
java·开发语言·spring boot·java-ee·intellij-idea