你能解释一下接下来的两行是做什么的吗?
// Line 1
*(long *)add1= *(long *)add2;
// Line 2
*(int *)add1 = *(int *)add2;
编辑 1. 我添加了我测试的函数的完整代码块。 PS 这只是脚本的一部分。 [original Skript]
这是一个自定义的 memcpy 函数,用于将内存块从 A 复制到 B。
(2)
while(word_left > 0){
*(char *)temp++ = *(char *)src++;
word_left --;
}
return (void *)dest;
}
Mr Vlag非常友好,并解释了第 (1) 部分中的行的含义。
我的问题是关于第 (2) 部分的。如果内存地址重叠,这部分应该可以解决问题。
为什么我们在这里使用char
?为什么我们不能使用 long
或 int
?
最佳答案
在两条记录中,const6ructions ( long * )
和 ( int * )
表示将指针转换为指针类型 long *
和 整数 *
。然后这些指针被取消引用 *( long * )addr2
和 *( int * )addr2
以访问指向的对象,这些对象的值被分配给也获得的其他对象通过强制转换和取消引用指针。
为了更清楚地考虑一个演示程序。
#include <stdio.h>
int main(void)
{
int x = 10;
int y = 0;
printf( "x = %d, y = %d\n", x, y );
void *p1 = &x;
void *p2 = &y;
*( int * )p2 = *( int * )p1;
printf( "x = %d, y = %d\n", x, y );
return 0;
}
程序输出为
x = 10, y = 0
x = 10, y = 10
例如,在这个程序中,void *
类型的指针 p1
由于转换 ( int * )p1
被解释为int *
类型的指针指向 int
类型的对象(在本例中它指向对象 x
)。现在取消引用此指针 *( int * )p1
您可以直接访问指向的对象 x
。
你可能不只是写例子
y = *p1;
因为 void
类型是不完整的类型,因此您不能取消引用 void 指针。因此编译器将不知道如何解释指向的内存。
关于c - *(long *) 和 *(int*) 是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69071257/