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