c - *(long *) 和 *(int*) 是什么意思?

标签 c pointers casting dereference

你能解释一下接下来的两行是做什么的吗?

// 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?为什么我们不能使用 longint

最佳答案

在两条记录中,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/

相关文章:

c++ - 模数( float )与分支

C# 或 C/C++ 如何从客户端接收数据包,过滤并将它们重定向到服务器,从服务器接收并发送给客户端

c - 在与原子加载和存储同步的线程之间共享变量是否安全?

c - 它是 c 中的学生日记程序。当我尝试通过获取编译器跳过名称来输入学生姓名时,它可以与 scanf 一起使用,但无法输入空格

c - 如何将空指针(结构返回类型)更改为声明的结构?

powershell - PowerShell返回类型

c - 这段代码是如何编译的? (C 中的函数声明不正确)

C++ 访问器——我应该返回一个指向成员变量的指针还是返回实际的成员变量本身?

c++ - 使用共享指针在两个类型模板化类之间进行转换

sql - 将数值转换为 VARCHAR2 会引发 ORA-03113