该指针数组如何显示此意外结果?

时间:2020-06-29 04:03:18

标签: c arrays pointers

在尝试理解C语言中的指针数组时,我编写了这个简单的程序。但是我不明白这是如何正常工作的:

#include <stdio.h>
int main() {
    int array [] = {1,2,3,4,5,6,7,8,9,0,1,2,5}, *ip = array+4;
    printf("%d\n", ip[1]);
    return 0;
}

输出为

6

有人能解释一下这个指针数组的输出结果是6吗?

4 个答案:

答案 0 :(得分:4)

如果您了解数组索引符号的含义,可能会有所帮助。当您看到x[y]时,它完全等同于*(x + y)

因此,以ip[1]为单位,

*(ip + 1)

由于ip被分配了值arr + 4,因此与以下内容相同:

*(arr + 4 + 1)

哪个是

*(arr + 5)

哪个是

arr[5]

其中包含值6。

答案 1 :(得分:1)

此处private temporary table指向arr的开头,即指向{1,2,3,4,5,6,7,8,9,0,1,2,5}

然后1将指向元素arr+4 (距离1个位置4个整数位置)

所以5将指向数组ip

然后,{5,6,7,8,9,0,1,2,5}将是ip[0]5将是ip[1]...。等等。

6

所以结果并不出乎意料。...正如预期的那样!

希望有帮助!

答案 2 :(得分:1)

根据S.K的深度C。 Srivastava

数组名是指向第一个的常量指针 数组的元素,即存储第一个元素的地址, 也称为数组的基地址。

因此,当您使用数组名称时,它将像您在使用&arr[0]一样,当您向其中添加4时,它会为您提供arr[4]的地址,即5。因此,指针ip现在包含包含5的元素的地址。
现在,在下一行中,当您编写ip[1]时,只不过是*(ip+1),即,您将1添加到ip上,然后取消对该指针的引用。当您将1添加到ip时,它开始指向下一个元素,即ip包含元素6的地址,因此6被打印。

另请参见:
https://www.cs.cmu.edu/~ab/15-123S09/lectures/Lecture%2005%20-%20%20Arrays%20and%20Pointers.pdf

答案 3 :(得分:0)

* ip = arr + 4 //这意味着ip将指向数组arr的底部的4个值。

所以ip是{5,6,7,8,9,0,1,2,5}

因此ip [1] = 6是正确的输出。