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))
即使只是简单地看一眼,也会发现语句保持不变的唯一方法是ifsizeof(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