我正在阅读在线书《使用ANSCI-C进行面向对象的编程》
第6页显示的实现set
。有一个带有add()
两个参数的函数:aset
和an 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的指针”,对吗?开头的星星似乎表明“所指事物的价值”,对吗?
对不起,我迷路了。代码在说什么?
更新(基于回答的问题)
感谢您的出色回应!
我对此表达式有一个后续问题: 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
,因此无法直接分配。
所以演员
* (int *) element = set — heap;
转换element
为int *
,然后解除引用,然后分配的结果set - heap
。
但是,这仅在以下情况下有效:
_element
指向的原始对象是可修改的对象。否则,丢弃const
行为是不确定的。int
对象。是的,set - heap
要减去两个指针。但这可能是无效的,因为:
减去两个指针的结果将得出a ptrdiff_t
,该a可能适合或可能不适合某种int
类型。
仅当两个指针指向同一个数组对象或指向数组对象的最后一个元素之后,该减法才有效。参见6.5.6加法运算符/ 9
总之,该代码可以解决您的问题。但是它需要满足上述条件才有效。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句