C 计算地址:指针+;非负数

C 计算地址:指针+;非负数,c,pointers,memory,C,Pointers,Memory,指针只能以离散的步骤移动 int *p; p = malloc(sizeof(int)*8); 因此,形式上*(p+2)计算为*(p+2*sizeof(int)) 然而,如果我真的对上面两个进行编码,我会得到不同的结果,这似乎是可以理解的 *p = 123; *(p+2) = 456; printf("%d\n",*(p+2*(sizeof(int)))); \\0 printf("%d\n",*(p+2)); \\456 问题是,这个计算是隐式的,是由编译器在编译时完成的吗 问题是,这个计

指针只能以离散的步骤移动

int *p;
p = malloc(sizeof(int)*8);
因此,形式上*(p+2)计算为*(p+2*sizeof(int))

然而,如果我真的对上面两个进行编码,我会得到不同的结果,这似乎是可以理解的

*p = 123;
*(p+2) = 456;
printf("%d\n",*(p+2*(sizeof(int)))); \\0
printf("%d\n",*(p+2)); \\456
问题是,这个计算是隐式的,是由编译器在编译时完成的吗

问题是,这个计算是隐式的,是由编译器在 编译时间

是的,这是隐式的,当您写入
ptr+n
时,它实际上向前推进n倍于指针类型大小的字节(例如,在
int*
的情况下,这是4个字节,在您的计算机上整数取4个字节)

e、 g

您可以阅读更多关于指针算法的内容

问题是,这个计算是隐式的,是由编译器在 编译时间

是的,这是隐式的,当您写入
ptr+n
时,它实际上向前推进n倍于指针类型大小的字节(例如,在
int*
的情况下,这是4个字节,在您的计算机上整数取4个字节)

e、 g

您可以阅读更多关于指针算法的内容

因此,形式上的
*(p+2)
计算为
*(p+2*sizeof(int))

否,
*(p+2)
计算为
*(int*)((char*)p+2*sizeof(int))

即使只是简单地看一眼,也会发现语句保持不变的唯一方法是if
sizeof(int)==1

因此,形式上的
*(p+2)
计算为
*(p+2*sizeof(int))

否,
*(p+2)
计算为
*(int*)((char*)p+2*sizeof(int))


即使只是简单地看一眼,也会发现语句保持不变的唯一方法是如果
sizeof(int)==1

此计算是隐式的,由编译器在编译时完成吗?:是。没错。在数字系统中,每一次计算都是在离散的步骤中完成的。“因此,将形式上的
(p+2)
计算为
(p+2*sizeof(int))
”是错误的<代码>(p+2)计算为
(int*)((char*)p+2*sizeof(int))
。取消引用是一种不同的操作。你可能想读一本好的C语言书。计算是隐式的,由编译器完成。与将
int[]
数组索引为0、1、2、3(不乘以
sizeof(int)
)的方法相同,指针算法也是如此。此计算是隐式的,由编译器在编译时完成吗?:是。没错。在数字系统中,每一次计算都是在离散的步骤中完成的。“因此,将形式上的
(p+2)
计算为
(p+2*sizeof(int))
”是错误的<代码>(p+2)计算为
(int*)((char*)p+2*sizeof(int))
。取消引用是一种不同的操作。你可能想读一本好的C语言书。计算是隐式的,由编译器完成。与将
int[]
数组索引为0、1、2、3(不乘以
sizeof(int)
)的方法相同,指针算法也是如此。
int *x = malloc(4 * sizeof(int)); // say x points at 0x1000
x++; // x now points at 0x1004 if size of int is 4