我在看在线书Object-Oriented Programming with ANSCI-C
第 6 页显示了一个 set
的实现。 .有一个add()
接受两个参数的函数:一个 set
和一个 element
. element
已添加到 set
.该实现使用一个指针数组:
static int heap [MANY];
这是add()
的开头功能:void * add (void * _set, const void * _element)
{
int * set = _set;
const int * element = _element;
if (* element == MANY)
* (int *) element = set — heap;
这是最后一行:* (int *) element = set — heap;
我不明白。右边似乎在减去指针,是吗?减去指针是常见的吗?在左侧显示 (int *)
正在类型转换 element
到“指向 int 的指针”,对吗?开头的星号似乎表示“所指事物的值(value)”,对吗?对不起,我迷路了。代码在说什么?
更新(基于回复的问题)
感谢您的出色回复!
我有一个关于这个表达式的后续问题:
set - heap
heap
是数组的名称。 set
是 heap
中的单元格之一,比如说,heap[2]
.因此,表达式减去指向 heap
的指针。从指向 heap[2]
的指针, 那正确吗?我用了 printf()
输出语句 heap
和输出 set
,这是它的输出:heap = 4227136
set = 4227140
所以,set - heap
等于 4
.这是否意味着 set
指向 heap[4]
(即,4
阵列开头的单元格)?是指向heap[i+1]
的指针始终保证是1
多于指向heap[i]
的指针?我输出
element
的值这条语句执行后:* (int *) element = set — heap;
正如刚才讨论的,set - heap
的值是 4
.输出表示 element
的值是 1
.怎么可能,不应该是element
的值吗?是 4
?
最佳答案
自 *element
是 const int
,不能直接赋值。
所以 Actor 阵容
* (int *) element = set — heap;
转换 element
至 int *
然后解引用,然后赋值set - heap
的结果.但是,这仅在以下情况下有效:
_element
的原始对象指向的是一个可修改的对象。否则,丢弃 const
是未定义的行为。 int
目的。 是的,
set - heap
减去两个指针。但它可能无效,因为:ptrdiff_t
可能适合也可能不适合 int
类型。总而言之,该代码可以解决您的问题。但需要满足上述条件才有效。
关于c - *(int *) variable = value 是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66754664/