【问题标题】:Pointer increment and chaining precedence in C#C#中的指针增量和链接优先级
【发布时间】:2010-07-11 09:52:15
【问题描述】:

我在一篇 msdn 文章中看到了这段 C# 代码:

using System; class Test
{
   public static unsafe void Main() 
   {
      int* fib = stackalloc int[100];
      int* p = fib;
      *p++ = *p++ = 1;
      for (int i=2; i<100; ++i, ++p)
         *p = p[-1] + p[-2];
      for (int i=0; i<10; ++i)
         Console.WriteLine (fib[i]);
   }
}

我对指针相当陌生。我理解大部分代码,但如果有人能帮助我更详细地理解上述代码中的这一行,那就太好了:

*p++ = *p++ = 1 

【问题讨论】:

  • 好问题,因为它在 C++ 中无效

标签: c# pointers


【解决方案1】:

这只是一种懒惰的(其他人会说惯用的)写作方式

*p++ = 1;
*p++ = *p++;

或者,也许更好理解:

*p=1;
p++;
*p=1;
p++;

【讨论】:

  • 好的!所以*p=1,然后指针移动到下一个内存位置。然后将该位置的值设置为 1,然后移动到下一个位置。伟大的!谢谢老哥!
  • 如果您觉得我的回答有用,请不要忘记接受。
  • 是的.. 只是等了 10 分钟 ;)
【解决方案2】:

在 C# 中*p++ = *p++ = 1; 相当于:

 *p++ = 1;
 *p++ = 1;

所以数组的前 2 个元素(这是 p 最初指向的)被初始化为 1,而 p 指向第三个元素(元素 2 使用从零开始的表示法)。

顺便说一句,请注意 C/C++ 中的类似语句将具有未定义的行为,因为指针 p 被多次修改而没有中间的“序列点”。但是,C# 以明确定义的方式计算表达式。

【讨论】:

  • 是的.. 我希望他们没有把 c# 复杂化这么多.. 对初学者来说有点困惑..
  • raze2dust:如果它让你感觉更好,那么指针的使用完全是非惯用的 C#。我从来没有写过(甚至见过)使用指针的生产代码。
【解决方案3】:

你需要把事情分解:

*p++

这是做两件事:取消引用 p 和后增量。 IE。显示地址 p 现在(或分配给它)和之后增加它(到下一个内存位置)。

因此其中两个允许分配到初始和第二个内存位置(同时留下p 指第三个)。

C# 允许链式赋值:a = b = 2 将 2 分配给 ab

NB 不要在 C 或 C++ 中尝试此操作,在单个表达式中多次修改同一事物 (p) 是未定义的。但 C# 确实定义了这一点。

【讨论】:

    【解决方案4】:

    表示在0和1位置分配的内存值设置为1。

    为了更清晰的理解:p*指向某个内存地址,设为start,直接指向另一个内存地址,等于start + sizeof(int)*100,设为end。

    在此示例中,将 startstart + sizeof(int) 处的元素设置为 1。后增量(*p++)意味着首先我们使用p*,然后它以sizeof(int) 值递增,第二个*p++ 意味着我们现在使用*p + sizeof(int),然后它再次递增,我们有@987654331 @。

    【讨论】:

      【解决方案5】:

      前三个 fib 数字是 0、1、1,这就是代码的作用。 (此处省略零)

      这样写会更清楚:

      *p++=1; // second fib
      *p++=1; // third fib. 
      

      【讨论】:

      • 程序输出的第一个数字不为零。
      • 那么它不是正确的斐波那契数列。正如我所说,这里跳过了。
      • 对不起,我忽略了关于零的注释。对不起。
      • 没问题。我只是想知道为什么我没有得到选票,因为我的答案与其他人非常接近(并且回答了问题恕我直言)
      【解决方案6】:

      在上面的代码中,您将生成 100 个斐波那契数列。

      在线 *p++ = *p++ = 1 ,您将前 2 个数字初始化为 1。 即在指针指向的地方填充数字 1。

      最初指针指向 0。当您执行 *p++ 时,这意味着指针应该从其指向的位置向前移动一个位置。

      所以在这种情况下,位置 1 的值被分配给位置 2 的值,而位置 2 的值被分配给值“1”。即 *p++ = *p++ = 1

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-08-18
        • 2014-01-24
        • 1970-01-01
        • 2019-06-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多