c-将指向const int的指针转换为仅指向int的指针(并对其进行修改)

安东·特列季亚科夫(Anton Tretyakov)

互联网的好人!

在我的新蜜蜂穿越C的暴风雨土地的整个过程中,我发现了这段代码:

void * add (void * _set, const void *_element)
{   int * set = _set;
    const int * element =_element;
    assert(set > heap && set < heap +MANY);
    assert(* set ==MANY);
    assert(element >heap && element < heap +MANY);
    if (* element == MANY)
        * (int *) element = set — heap;
    else
        assert(* element == set —heap);
    return (void *)element;
}

在这段代码中,heapints的数组MANY是整数文字的宏,整个思想是存储heapin的某个元素的索引element(或检查它是否已存在)。_set_element假定是指向heap的元素的指针

问题是-他们为什么能先说一个_element指向const的点,然后创建一个指向element该点的新指针const int然后将其转换为常规的指针int,然后对其进行修改int难道不是坏禁咒吗?

预先感谢您,先生!

干杯!

埃里克·波斯蒂奇(Eric Postpischil)

如果使用定义一个对象const,则C标准不会定义尝试对其进行修改的行为。

但是,如果定义的对象没有 const,则可以指向该对象,将其添加const到该指针,然后再删除const例如,以下行为具有明确定义的行为:

int x = 3;

// Fine, make a pointer to x:
int *p = &x;

// Copy into a `const int *`.
// Compiler accepts adding `const` without complaint:
const int *cp = p;

// Copy into an `int *` without `const`.
// Requires a cast because the compiler would complain without it:
int *np = (int *) cp;

// Change x, which was not defined with `const`.
*np = 4;

// Prints 4:
printf("%d\n", x);

使用此方案的情况是,提供某些功能的库将创建一个对象,并希望客户端不要对其进行修改。因此,它为对象分配了空间,并为客户端提供了一个const指向对象的合格指针。(尽管客户端可以通过使用强制类型转换来删除对象,const如上所示,但值得信赖的是,这种方法是为了防止无辜的错误,而不是防止故意的恶意。)后来,当库想要修改或取消分配对象时,对象,它可以使用从客户端接收回来的指针,并使用强制转换删除const限定符。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么将指向int的指针转换为void *但将指向函数的指针转换为bool?

来自分类Dev

修改C ++函数中指针指向的位置

来自分类Dev

指向C ++中const int的指针

来自分类Dev

无法在指向结构的指针中将a :: c *转换为c *

来自分类Dev

C:指针类型之间的非法转换:指向const unsigned char的指针->指向unsigned char的指针

来自分类Dev

ctypes指向c_int与c_ints数组的指针

来自分类Dev

C ++制作指向const对象的指针数组

来自分类Dev

指向const指针(或指向const的指针)

来自分类Dev

c ++:“指向const的指针”所指向的对象是否被视为不变或只是不可修改?

来自分类Dev

将指向const指针的引用从指向非const的指针安置

来自分类Dev

如果我在c ++中将(指向类A的指针)转换为(指向其子类B的指针)会发生什么

来自分类Dev

在为const时返回指向自身的指针的类函数。C ++

来自分类Dev

指向C中的int指针数组的指针

来自分类Dev

C ++指向const指针的const数组的指针

来自分类Dev

在Swift中与指向Int数组的C指针互操作

来自分类Dev

C ++:使用int指针指向在函数内部创建的向量

来自分类Dev

C ++ int指向数组的指针指向数组内存泄漏

来自分类Dev

“指向const int的指针”是否与“ const int *”相同

来自分类Dev

指向int的指针的c ++指针

来自分类Dev

指向int的指针在C ++中无法正常配合

来自分类Dev

错误类型转换指向int的void指针

来自分类Dev

在C ++中将指向数组的指针转换为Java(OpenCV)

来自分类Dev

指向int的const数组的指针

来自分类Dev

C-将指针转换为指向void的指针

来自分类Dev

类型转换为一个指向int的指针。

来自分类Dev

将int array []或指向int array []的指针返回到C中的调用例程的函数

来自分类Dev

将 int 转换为字符串指针 C

来自分类Dev

C const 指向 const struct 数组的指针作为函数参数

来自分类Dev

以高效的 C++11 方式将指向数组的指针转换为结构

Related 相关文章

  1. 1

    为什么将指向int的指针转换为void *但将指向函数的指针转换为bool?

  2. 2

    修改C ++函数中指针指向的位置

  3. 3

    指向C ++中const int的指针

  4. 4

    无法在指向结构的指针中将a :: c *转换为c *

  5. 5

    C:指针类型之间的非法转换:指向const unsigned char的指针->指向unsigned char的指针

  6. 6

    ctypes指向c_int与c_ints数组的指针

  7. 7

    C ++制作指向const对象的指针数组

  8. 8

    指向const指针(或指向const的指针)

  9. 9

    c ++:“指向const的指针”所指向的对象是否被视为不变或只是不可修改?

  10. 10

    将指向const指针的引用从指向非const的指针安置

  11. 11

    如果我在c ++中将(指向类A的指针)转换为(指向其子类B的指针)会发生什么

  12. 12

    在为const时返回指向自身的指针的类函数。C ++

  13. 13

    指向C中的int指针数组的指针

  14. 14

    C ++指向const指针的const数组的指针

  15. 15

    在Swift中与指向Int数组的C指针互操作

  16. 16

    C ++:使用int指针指向在函数内部创建的向量

  17. 17

    C ++ int指向数组的指针指向数组内存泄漏

  18. 18

    “指向const int的指针”是否与“ const int *”相同

  19. 19

    指向int的指针的c ++指针

  20. 20

    指向int的指针在C ++中无法正常配合

  21. 21

    错误类型转换指向int的void指针

  22. 22

    在C ++中将指向数组的指针转换为Java(OpenCV)

  23. 23

    指向int的const数组的指针

  24. 24

    C-将指针转换为指向void的指针

  25. 25

    类型转换为一个指向int的指针。

  26. 26

    将int array []或指向int array []的指针返回到C中的调用例程的函数

  27. 27

    将 int 转换为字符串指针 C

  28. 28

    C const 指向 const struct 数组的指针作为函数参数

  29. 29

    以高效的 C++11 方式将指向数组的指针转换为结构

热门标签

归档