c - *(int *) variable = value 是什么意思?

标签 c

我在看在线书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 - heapheap是数组的名称。 setheap 中的单元格之一,比如说,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 ?

最佳答案

*elementconst int ,不能直接赋值。
所以 Actor 阵容

    * (int *) element = set — heap;
转换 elementint *然后解引用,然后赋值set - heap的结果.
但是,这仅在以下情况下有效:
  • _element 的原始对象指向的是一个可修改的对象。否则,丢弃 const是未定义的行为。
  • 指向 int目的。

  • 是的,set - heap减去两个指针。但它可能无效,因为:
  • 两个指针相减的结果是 ptrdiff_t可能适合也可能不适合 int类型。
  • 减法仅在两个指针指向同一个数组对象或指向数组对象的最后一个元素之后才有效。见 6.5.6 Additive operators/9

  • 总而言之,该代码可以解决您的问题。但需要满足上述条件才有效。

    关于c - *(int *) variable = value 是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66754664/

    相关文章:

    c - 寻找类似于 PHP 的 C/C++ str_replace(),但没有 malloc()/realloc(),使用原始缓冲区

    c++ - 配置gmp时出错

    比较 C 函数中的三个 float

    c - scanf() 不接受多个输入

    c - Visual C 接受错误数量的参数?

    c - 128 位整数在英特尔 C 编译器中支持 +、-、*、/和 %?

    c++ - 排序原子链表算法(优先队列)

    c - 如何将文件名添加到系统日志字符串?

    c - 如何在 Linux 中手动查找目录?

    c++ - Linux 中的转义字符不起作用