Pointers 需要帮助理解给定代码中的指针吗

Pointers 需要帮助理解给定代码中的指针吗,pointers,Pointers,我是C编程新手,我无法理解代码的第四行是如何工作的 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

我是C编程新手,我无法理解代码的第四行是如何工作的

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);
        }

任何帮助都将不胜感激。

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

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

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);
        }
让我们检查第四行的右侧:

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);
        }
  • s
    是指向要复制的源内存区域的指针
  • 第一次强制转换(
    (int*)s
    )意味着将其视为指向
    int
  • 它前面的偏差(
    *(int*)s
    )表示取点所指向的值
这同样适用于表达式的左侧

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);
        }

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

d是指针。它被声明为指向“FBYTE”的指针,不管FBYTE是什么-编写它的程序员需要被打耳光,因为char*或unsigned char*可以很好地完成这项工作

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);
        }
(int*)d是同一个指针,但编译器被告知它是指向int的指针

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);
        }
当您有一个指针int*p时,例如,赋值p=5将数字5赋值给p指向的int值。这里,(int)d是指向int的指针,所以我们也在它前面写一个*,并且*(int*)d=which将“which”赋值给这个指针指向的int

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);
        }
那么整行的作用是:取指针s。假设它是指向int的指针,而不是指向FBYTE的指针。读取它指向的int。拿着指针d。假设它是指向int的指针,而不是指向FBYTE的指针。将刚刚读取的int写入d指向的int

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);
        }

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

这只是一种极其复杂且极其缓慢的复制数据的方式,而不是调用memcpy。在某些移动设备上,这将运行得非常慢。
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);
        }