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?如果你想访问介于两者之间的内存值,你可能会破坏一些别名规则,并最终导致未对齐的内存操作,这将使某些体系结构崩溃。不过,这不应该是个问题,因为如果需要更细粒度的控件,那么首先将使用不同的值类型。