【问题标题】:What is the difference between a pointer and an array? [duplicate]指针和数组有什么区别? [复制]
【发布时间】:2021-03-14 22:41:16
【问题描述】:

正如标题本身,我很难理解指针和数组之间相似性的概念。

我知道,它们使用相同的逻辑,并且数组变量是指向第一个元素地址的指针,但是它们之间有什么区别吗?

【问题讨论】:

  • 相关:C: differences between char pointer and array。来自C language standard: "除非它是 sizeof 运算符、_Alignof 运算符或一元 & 运算符的操作数,或者是用于初始化数组的字符串字面量,即 ''array 类型的表达式'' 类型的表达式被转换为类型为 ''pointer to type'' 的表达式,它指向数组对象的初始元素"。
  • 一个有数据存储,另一个没有:((

标签: arrays c function pointers


【解决方案1】:

数组和指针是非常不同的东西:

将数组想象为城市中的一栋房屋,将指针想象为一张纸,上面写着第一所房屋的 GPS 坐标。

方块不能移动,你也不能改变它的大小。房子可以建在块上(赋值),不会改变指针上的坐标。

街道名称(数组名称)可用于指代给定的房子,但坐标同样有效,尤其是对于没有地图的人(数组名称超出范围)。

您可以通过擦除坐标并写入不同的坐标来使指针指向另一所房子。什么都不写类似于使指针成为空指针。如果房屋被毁或街道限制通行,使用 GPS 坐标前往那里可能会给您带来麻烦(分段错误)。

只看指针,你无法知道街区有多少房子。到达那里并挨家挨户可能会感到安全,但您无法知道街道的尽头和另一条街道的起点,或者您可能越过边界进入敌方领土(越界访问,未定义的行为)。

坐标可以是任何房子的坐标,不一定是街道的第一个。如果它们具有已知大小(指针增量),则以几何方式更改它们可能会让您到达下一个房子。

您可以将一些纸放在口袋里(CPU 寄存器),也可以将它们贴在墙上(将它们存储在内存中)...此时它们本身就有 GPS 坐标,您可以将其写在一张纸上纸(指向指针的指针)。

在 C 中,当您将数组作为参数传递时,该函数仅获取其地址作为指针,就像优步司机获取 GPS 坐标一样。

【讨论】:

    【解决方案2】:

    没错,数组变量指向它的第一个元素,但它与指针的不同之处在于它不能重新分配给其他地址,这也意味着你不能对其执行任何算术运算更改它指向的地址。 例如,int a[] 是一个数组,int* ptr=a 是一个指向这个 int 数组的指针。 现在ptra 现在都指向同一个地址。 假设还有另一个数组int b[] 现在,

    ptr=b;  // valid
    a=b;    //invalid
    ptr++;  //valid
    a++;    //invalid
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-07
      • 2021-05-11
      • 1970-01-01
      • 2011-04-04
      • 2010-12-17
      • 2013-07-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多