【问题标题】:What is the difference between a pointer and an array? [duplicate]指针和数组有什么区别? [复制]
【发布时间】:2021-03-14 22:41:16
【问题描述】:
正如标题本身,我很难理解指针和数组之间相似性的概念。
我知道,它们使用相同的逻辑,并且数组变量是指向第一个元素地址的指针,但是它们之间有什么区别吗?
【问题讨论】:
标签:
arrays
c
function
pointers
【解决方案1】:
数组和指针是非常不同的东西:
将数组想象为城市中的一栋房屋,将指针想象为一张纸,上面写着第一所房屋的 GPS 坐标。
方块不能移动,你也不能改变它的大小。房子可以建在块上(赋值),不会改变指针上的坐标。
街道名称(数组名称)可用于指代给定的房子,但坐标同样有效,尤其是对于没有地图的人(数组名称超出范围)。
您可以通过擦除坐标并写入不同的坐标来使指针指向另一所房子。什么都不写类似于使指针成为空指针。如果房屋被毁或街道限制通行,使用 GPS 坐标前往那里可能会给您带来麻烦(分段错误)。
只看指针,你无法知道街区有多少房子。到达那里并挨家挨户可能会感到安全,但您无法知道街道的尽头和另一条街道的起点,或者您可能越过边界进入敌方领土(越界访问,未定义的行为)。
坐标可以是任何房子的坐标,不一定是街道的第一个。如果它们具有已知大小(指针增量),则以几何方式更改它们可能会让您到达下一个房子。
您可以将一些纸放在口袋里(CPU 寄存器),也可以将它们贴在墙上(将它们存储在内存中)...此时它们本身就有 GPS 坐标,您可以将其写在一张纸上纸(指向指针的指针)。
在 C 中,当您将数组作为参数传递时,该函数仅获取其地址作为指针,就像优步司机获取 GPS 坐标一样。
【解决方案2】:
没错,数组变量指向它的第一个元素,但它与指针的不同之处在于它不能重新分配给其他地址,这也意味着你不能对其执行任何算术运算更改它指向的地址。
例如,int a[] 是一个数组,int* ptr=a 是一个指向这个 int 数组的指针。
现在ptr 和a 现在都指向同一个地址。
假设还有另一个数组int b[]
现在,
ptr=b; // valid
a=b; //invalid
ptr++; //valid
a++; //invalid