代码之家  ›  专栏  ›  技术社区  ›  Hari Menon

C语言中的指针增量和链表优先级#

  •  9
  • Hari Menon  · 技术社区  · 16 年前

    我在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 
    
    6 回复  |  直到 14 年前
        1
  •  8
  •   Doc Brown    16 年前

    那只是一种懒惰的(别人会说是惯用的)写作方式

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

    *p=1;
    p++;
    *p=1;
    p++;
    
        2
  •  2
  •   Michael Burr    16 年前

    在C中# *p++ = *p++ = 1;

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

    p 最初指向)初始化为1,p左指第三个元素(使用基于零的表示法的元素2)。

    另外,请注意,C/C++中类似的语句自指针起将有未定义的行为。 在没有中间“序列点”的情况下被多次修改。但是,C#以定义良好的方式计算表达式。

        3
  •  2
  •   Richard    16 年前

    你需要把事情分解:

    *p++

    这是做两件事:解引用p和后增量。即显示地址上的内容 p 之后 增加它(到下一个内存位置)。

    所以其中两个允许分配到初始和第二个内存位置(在离开时) p 指第三个)。

    C#允许链式分配: a = b = 2 两个都指定2 a b .

    注意 p )一个表达式中有多次未定义。但C确实定义了这一点。

        4
  •  2
  •   Eugene Cheverda    16 年前

    这意味着在0和1位置的分配内存值设置为1。

    start start + sizeof(int)*100 ,随它去吧 en

    在本例中,将元素设置为1 start + sizeof(int) . 后增量( *p++ p* sizeof(int) 价值,第二 意味着我们现在使用 *p + sizeof(int) 然后它再增加一次,我们有 *p + sizeof(int)*2 .

        5
  •  1
  •   InsertNickHere    16 年前

    前三个fib数字是0,1,1,这就是代码的作用(此处跳过零)

    *p++=1; // second fib
    *p++=1; // third fib. 
    
        6
  •  1
  •   YoK    16 年前

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

    i、 e.在指针指向的地方填写数字1。

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