【问题标题】:Need help understanding pointers in given code需要帮助理解给定代码中的指针
【发布时间】:2014-06-21 15:43:29
【问题描述】:
FBYTE *d = (FBYTE*) dst; 
const FBYTE *s = (const FBYTE*) src;
 while(cnt >= sizeof(int)) {
                *(int*) d = *(int*) s;
                 d += sizeof(int);
                 s += sizeof(int);
                 cnt -= sizeof(int);
        }

我是 C 编程新手,无法理解第 4 行代码的工作原理

     *(int*) d = *(int*) s; 

任何帮助将不胜感激。

【问题讨论】:

  • 这只是复制数据而不是调用 memcpy 的一种荒谬的复杂且非常缓慢的方法。在某些移动设备上,这会非常缓慢运行。

标签: pointers


【解决方案1】:

整段代码是关于将src 中的缓冲区复制到dstwhile 循环遍历 src,并在每次迭代中复制一个 int

让我们看看第四行的右手边:

  • s 是指向要复制的源内存区域的指针。
  • 第一次转换 ((int *)s) 意味着将其视为指向 int 的指针
  • 在它之前的尊重 (* (int *)s) 意味着取该点指向的值。

这同样适用于表达式的左侧。

因此,基本上,您正在迭代 src 缓冲区,并在每次迭代中将当前 int 复制到 dst

【讨论】:

    【解决方案2】:

    括号优先,因此您将其转换为 int 类型的指针,然后检索该指针 s 指向的值(取消引用)并将其复制到 d 指向的任何位置。

    【讨论】:

      【解决方案3】:

      d 是一个指针。它被声明为指向“FBYTE”的指针,无论 FBYTE 是什么 - 编写此代码的程序员都需要被打,因为 char* 或 unsigned char* 可以很好地完成这项工作。

      (int *)d 是同一个指针,但编译器被告知它是一个指向 int 的指针。

      当您有一个指针 int* p 时,例如,赋值 p = 5 会将数字 5 分配给 p 指向的 int 值。这里,(int) d 是一个指向 int 的指针,所以我们还在它前面写了一个 *,并且 * (int *)d =whatever 将“whatever”分配给这个指针指向的 int。

      那么整行的作用是:取指针 s。假设它是指向 int 的指针,而不是指向 FBYTE 的指针。阅读它指向的 int 。取指针 d。假设它是指向 int 的指针,而不是指向 FBYTE 的指针。将您刚刚读取的 int 写入 d 指向的 int 。

      不应该编写这样的代码。这是一个试图变得聪明而失败的明显例子。如果要复制数据,请调用 memcpy 或 memmove。他们复制数据的速度可能会快十倍。在这种情况下,在某些情况下,iPhone memcpy 可能会快 1000 倍(因为代码无法检查指针是否对齐)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-04
        • 2011-12-04
        • 1970-01-01
        • 2021-07-29
        • 2010-11-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多