C 遍历指针列表的正确方法?

C 遍历指针列表的正确方法?,c,pointers,C,Pointers,我无法理解指针数组的概念。问题是我试图遍历指针列表(或者至少从指针数组中获取第二个值)。我知道integer的长度为4字节(假设im为32位)。我要做的是获取指向[0]的第一个地址,然后向这个地址添加4个字节,我认为这将导致[1]。不过,这是可行的,因为我只是在为索引添加值。即f[0]+4->f[5] 我不太明白为什么 #include "stdio.h" int main() { int a[6] = {10,2,3,4,20, 42}; in

我无法理解指针数组的概念。问题是我试图遍历指针列表(或者至少从指针数组中获取第二个值)。我知道
integer
的长度为4字节(假设im为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;
    }
#包括“stdio.h”
int main()
{
inta[6]={10,2,3,4,20,42};
int*f[6];
对于(inti=0;i
指针算法考虑指针的大小。
f[0]+4
将用4乘以整数类型的大小。 这是一个在线反汇编程序:。 当我键入代码
f[0]+4
时,反汇编显示为

add     QWORD PTR [rbp-8], 16

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

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

使用索引
a[n]
基本上意味着
转到a的位置(数组的开头),然后前进n*sizeof(int)字节

  • a[0]
    表示
    转到a的位置,然后不要跳转
  • a[1]
    表示
    转到a的位置,然后跳转1倍于整数的大小
  • a[2]
    表示
    转到a的位置,然后跳到整数大小的2倍
假设
a
位于地址
0xF00D0000
,并且您在32位计算机上:

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

我希望这是有意义的。

警告:指针并不总是4字节!由于
*(*f+i)
中的运算符优先级,您的示例的工作方式可能与您想象的不一样。永远不要依赖给定大小的变量-除了三种
char
类型之外,但即使这些类型也可以有8位或更多位。
int*f[6],*p;对于(i=0,p=f[0];i<6;i++,p++)printf(“%p%d\n”,p,*p)
C已经知道事物的大小,所以它知道a[1]比a[0]多4个字节(假设32位整数)。若你们想自己处理寻址问题,你们需要使用“char”指针(通过赋值或强制转换)?通过添加变量所指向类型的指针大小?如果您有一个指针,并且希望遍历它的值,您可以使用
for(int i=0;i
for(int i=0;i
。C处理值的大小。感谢您的代码示例。在这种情况下,我不能直接访问内存,而内存将增加sizeof?如果你想访问介于两者之间的内存值,你可能会破坏一些别名规则,并最终导致未对齐的内存操作,这将使某些体系结构崩溃。不过,这不应该是个问题,因为如果需要更细粒度的控件,那么首先将使用不同的值类型。