Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C语言中的指针增量和链接优先级#_C#_Pointers - Fatal编程技术网

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

C# C语言中的指针增量和链接优先级#,c#,pointers,C#,Pointers,我在一篇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

我在一篇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++ = 1;
*p++ = *p++;
或者,或许更好地理解:

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

 *p++ = 1;
 *p++ = 1;
因此,数组的前2个元素(即
p
最初指向的元素)被初始化为1,p向左指向第三个元素(使用基于零的表示法的元素2)


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

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

写下来会更清楚:

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

你需要把事情分解:

*p++

这是在做两件事:解引用p和后期增量。也就是说,现在显示地址
p
上的内容(或分配给它),然后递增地址(到下一个内存位置)

其中两个允许分配到初始和第二个内存位置(同时将
p
留给第三个)

C允许链式分配:
a=b=2
将2分配给
a
b


<强> Nb<强>不要在C或C++中尝试,在单个表达式中修改同一个东西(<代码> p>代码>)是未定义的。但C#确实定义了这一点。

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

为了更清楚地理解:p*指向内存的某些地址,让它成为
start
,正好指向另一个内存地址,它等于
start+sizeof(int)*100
,让它成为
en
d


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

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

在第*p++=*p++=1行,您正在将前2个数字初始化为1。 i、 e.在指针指向的位置填写数字1

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


因此,在这种情况下,位置1处的值被分配给位置2处的值,位置2处的值被分配给值“1”。i、 e.*p++=*p++=1

程序输出中的第一个数字不是零。那么它就不是正确的斐波那契序列。正如我所说,这里跳过了。对不起,我忽略了关于零的注释。对不起,没问题。我只是想知道为什么我得不到选票,因为我的答案和其他人很接近(并且回答了问题imho),好吧!因此*p=1,指针移动到下一个内存位置。然后将该位置的值设置为1,然后移动到下一个位置。伟大的谢谢你,伙计!如果你觉得我的答案有用,请别忘了接受。是的。。只是等了10分钟;)是 啊我希望他们没有把c#弄得这么复杂。。对于初学者来说有点困惑raze2dust:如果它能让你感觉更好,那么指针的使用完全不是惯用的C。我从来没有编写(或甚至看到)使用指针的生产代码。好的问题,因为它在C++中是无效的。
*p++=1; // second fib
*p++=1; // third fib.