从访问角度上看待数组和指针的区别

二、从访问角度上看待数组和指针的区别?

1. What’s a Declaration? What’s a Definition? 在 C 语言中,什么是声明?什么是定义?

  • 声明 Declaration:描述在其他地方创建的对象,并不分配内存。(可以出现在多个地方)
  • 定义 Definition:产生一个新的对象,并分配内存。(只能出现一次)

2. 注意一下 “地址y” 和 “地址y的内容” 的区别?

“地址y” 表示变量y在内存中的地址,而 “地址y的内容” 指的是位于这个地址中的内容,也就是变量y的值。大多数编程语言中用同一个符号表示这两个东西,而由编译器根据上下文环境判断它的含义。如下图

image.png

  • 上文中的x指的是x所代表的地址,而y的含义是y的内容。
  • 出现在赋值符号左边的值称为左值、赋值符号右边的称为右值。编译器为每个变量分配地址(左值)。这个地址在编译时可知且一直存在,而它的右值在运行时才能知道。通俗说:每个变量都有一个地址,这个地址在编译时可以知道,而地址里存储的内容(也就是变量的值)只有在运行时才能知道。如果需要用到变量的值,(也就是已知地址存储的值)那么编译器发出指令从指定地址读入变量值并放入相应寄存器中。

3. 直接使用数组名字访问数组元素的过程

image.png

  • ① a 所代表的地址就是 9980 ② (9980+i)即可获得需要访问的数据

4. 使用数组指针访问数组元素的过程

image.png

  • ①指针 p 所在的地址是 4624 ②取出地址 4624 所存储的地址 5081 ③(5081+i)即可获得需要访问的数据

5. 总结 数组名字数组指针 访问数组元素过程的区别?

  • 如果是数组 a[],那么可以直接用数组名来访问数组中的元素,因为它的内容就是第一个元素,他的下一个地址也就对应了下一个元素的地址。
  • 如果是指针 *a,先要取出 a 的内容,再把它作为变量的地址并从这个地址中取得变量的内容。

5. C 语言的数组形参是指针吗?为什么?(非常重要)

  • C 语言会把数组形参当成指针
  • 把作为形参的数组当做指针来考虑其实是出于效率考虑。C 语言汇总,所有非数组形式的数据实参均为值传递形式
  • 而对于数组,如果每次调用函数都要拷贝整个数组的话,就会花费大量的性能和空间开销,所以对于数组,C 语言的机制是告诉函数数组的首地址,直接对数组进行操作。
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享