迭代指针列表的正确方法?

时间:2017-02-20 21:03:18

标签: c pointers

我无法理解指针数组的想法。问题是我试图遍历指针列表(或者至少从指针数组中获取第二个值)。我知道integer长度为4个字节(假设我在32位上)。我想要做的是获得指向[0]的第一个地址,并将此地址添加到4个字节,在我看来,这将导致[1]。但是,这就像我只是为索引增加价值一样。即f[0] + 4 -> f[5] 而且我不太明白为什么。

 #include "stdio.h"
    int main()
    {
        int a[6] = {10,2,3,4,20, 42};
        int *f[6];
        for(int i = 0; i < sizeof(a)/sizeof(int); i++) f[i] = &a[i];
        for(int i = 0; i < sizeof(a)/sizeof(int); i++) printf("Current pointer points to %i\n", *(*f+i));
        printf("The is %i", *(f[0]+sizeof(int)));
        return 1;
    }

2 个答案:

答案 0 :(得分:2)

指针算法会考虑指针的大小。 f[0] + 4将乘以整数类型的大小4。 这是一个在线反汇编程序:https://godbolt.org/。 当我输入代码f[0] + 4时,反汇编显示为

add     QWORD PTR [rbp-8], 16

意味着它将4乘4(32位= 4字节)乘以16。

答案 1 :(得分:2)

数组是指向一大块RAM的指针。 int a[6] = {10,2,3,4,20, 42};实际创建了一个[0x0000000A, 0x00000002, 0x00000003, 0x00000004, 0x00000014, 0x0000002A]的块,a指向列表开始的位置。

使用索引a[n]基本上意味着go to the position of a (start of the array), then advance by n*sizeof(int) bytes

  • a[0]表示Go to position of a, then don't jump
  • a[1]表示Go to position of a, then jump 1 time the size of an integer
  • a[2]表示Go to position of a, then jump 2 times the size of an integer

假设a位于地址0xF00D0000,并且您使用的是32位计算机:

a[0] // Pointer to 0xF00D0000
a[1] // Pointer to 0xF00D0004
a[2] // Pointer to 0xF00D0008
a[32] // Pointer to 0xF00D0080

我希望这是有道理的。