数组实际上不是指针,尽管它们的行为方式有点相似,但并非总是如此。
假设你有这个数组和一个指针:
int a[] = {1, 2, 3};
int i = 19;
int *ptr = &i;
现在在这里,但对于指针 ( ) a is equal to &a
,情况并非如此。ptr is not equal to &ptr
现在来到这个问题:
考虑一个一维数组:
int arr[] = {11, 19, 5, 9};
在这里,这个数组元素存储在连续的内存位置。说,起始地址0
:
---------------------
| 11 | 19 | 5 | 9 |
---------------------
0 4 8 12 16
现在,当您写入数组的名称 arr(对于此示例)时,您将获得第一个元素的起始地址。虽然如果你写&arr
,那么你会得到整个块的起始地址(这包括数组的所有元素)。现在,当您编写 时*arr
,您实际上得到了该数组的第一个元素内的值。
现在考虑这个二维数组 arr[][4] = {{11, 19, 5, 9}, {5, 9, 11, 19}}:
0 4 8 12 16 -> These are memory addresses
---------------------
| 11 | 19 | 5 | 9 | ----> These values represent the values inside each index
---------------------
| 5 | 9 | 11 | 19 |
---------------------
16 20 24 28 32
在这里,当你写数组的名称 asarr
时,你得到的是这个数组的第一个元素的地址,在这种情况下将是这个第 0个索引的地址:
0 16 32
----------------------------------------------
| 0<sup>th</sup> index | 1<sup>st</sup> index |
----------------------------------------------
现在,当你这样做时&arr
,你得到的是整个块的基地址,即它的基地址:
0 4 8 12 16
---------------------
| 11 | 19 | 5 | 9 |
---------------------
| 5 | 9 | 11 | 19 |
---------------------
16 20 24 28 32
现在,如果你这样做*arr
,在一维数组中它会给你第一个元素内的值,虽然在二维数组中,每个索引内的值实际上是一个一维数组,因此你会得到这个地址大批:
0 4 8 12 16
---------------------
| 11 | 19 | 5 | 9 |
---------------------
现在,如果您这样做**arr
,那您实际上将获得第一个元素内的值,即11
.
我希望它能消除一些疑问:-)
编辑1:
正如其他用户提醒我的那样,尽管我已经详细解释了什么是什么意思,但似乎在某处有些混乱。但只是为了证明这一点:
现在这里 __a 等于 &a__,但对于指针(__ptr 不等于 &ptr__),情况并非如此。
正如已经在答案中所述,两者的类型都会有所a
不同。&a
如果一个人执行指针算术,一个人将能够知道这一点。尝试执行a + 1
and &a + 1
,它们对指针算术的反应肯定会给出一个好主意。
考虑一维数组:
int arr[] = {11, 19, 5, 9};
---------------------
| 11 | 19 | 5 | 9 |
---------------------
0 4 8 12 16
我们不能这样做a++
,但对于指针:
int i = 4;
int *ptr = &i;
我们可以执行ptr++
,这将ptr
指向下一个内存位置。