我无法理解指针数组的想法。问题是我试图遍历指针列表(或者至少从指针数组中获取第二个值)。我知道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;
}
答案 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
我希望这是有道理的。