C# C语言中的指针增量和链接优先级#
我在一篇msdn文章中看到了这段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
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.