【问题标题】:pointer incrementation and assignment指针递增和赋值
【发布时间】:2018-09-08 19:56:35
【问题描述】:

在C语言的以下两行中:

int* a = (int *)calloc(automata_size, sizeof(int));

int* b = (a++);

我发现 a 和 b 共享同一个地址。如果我们有,情况并非如此

int* a = (int *)calloc(automata_size, sizeof(int));

int* b = a + 1;

为什么?

【问题讨论】:

  • 因为 a++ 和 a+1 的值不同。查看后增量运算符的定义。
  • 不是a++和a=a+1是等价的表达式吗?
  • 不,它们返回不同的值。查看后增量运算符的定义。
  • 非常感谢!很抱歉,这可能会导致比网站更简单的解释。
  • int* b = a + 1改变a。但是,int* b = (*a++) 可以。与int* b = a++ 相同。这是 postincrement 形式。要获得您想要的效果,请执行以下操作:int *b = ++a。这是 preincrement 形式。使用 postincrement,ab 会有所不同,但使用 preincrement 之后它们将是相同的

标签: c pointers memory-management


【解决方案1】:

前缀和后缀++ 运算符具有结果副作用

a++结果a 在增量之前的值。 副作用a 增加了。因此,如果a 类似于0x4000sizeof (int) 是4,那么在执行之后

int *b = a++;

b 的值为0x4000a 的值为0x40041

++a结果a 的值加1。副作用a 增加。这一次,ba 的值都是0x4004

注意:您将希望以某种方式保留从calloc 返回的原始值,以便以后可以正确地free 它。如果将 a 的修改值传递给 free,您将(很可能)得到运行时错误。


  1. 指针算法取决于指向类型的大小。应用++ 或将 1 加到一个指针上使其指向给定类型的 下一个对象。在当今使用的大多数系统中,int 的宽度为 4 个字节,因此在指针上使用 ++ 会将指针值加 4。

【讨论】:

    【解决方案2】:

    所以我的建议是谷歌后增量和前增量。预增量 (++a) 是:

    b = ++a;
    

    和是一样的:

    a = a + 1;
    b = a;
    

    作为后增量:

    b = a++;
    

    相同
    b = a;
    a = a + 1;
    

    这适用于指针和整数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多