【问题标题】:What's the difference between ptr[i] and *(ptr + i)?ptr[i] 和 *(ptr + i) 有什么区别?
【发布时间】:2014-06-16 10:51:43
【问题描述】:

使用指向数组的指针时,我总是使用索引器访问元素,例如myPtr[i] = stuff;但是,我最近在查看 BitConverter's implementation 并发现元素是通过 *(myPtr + i) = stuff 访问的。

我认为这很奇怪,因为这两种方法(据我所知)做的事情完全相同,也就是说,它们返回myPtr + i 的地址,除了(在我看来)索引器方法看起来更具可读性.

那么微软为什么选择以他们的方式递增指针,这两种方法有什么区别(是否有性能优势)?

【问题讨论】:

  • 它们生成相同的 IL。这只是风格问题。
  • ToBoolean 方法很棒。 cmets 与代码不匹配,它具有出色的 x == 0 ? false : true 模式,而不是使用普通的 x != 0

标签: c# .net arrays pointers


【解决方案1】:

正如你所说,他们做同样的事情。

事实上,当访问int* 时,ptr[i]*(ptr + i) 语法都会跳过边界检查,如果i 大于数组长度,则指向数组边界之外的一些内存。

我很确定 C# 和 C++ 都使用 C 中的 *(ptr + index) 语法继承了对数组指针的索引访问。我很确定这是两种语法都可用的唯一原因。

【讨论】:

  • 所以myPrt[i] 只是语法糖?除此之外没有其他区别吗?
  • @Sam 是的,应该没有其他区别。
  • @dcastro 据我记得,使用索引器可以为您提供IndexOutOfRangeException,而*(ptr + index) 只会将您指向数组之外的一些内存。
  • @AndreySarafanov 例如,使用索引器会给你一个 IOR if 你正在访问一个 int 数组。如果您正在访问int*,那么[index]*(ptr + index) 语法都将指向数组外的一些内存。两种语法都将跳过边界检查。
  • @dcastro 谢谢,我确实很糟糕,应该更仔细地阅读这个问题。
【解决方案2】:

来自CSharp Language Specification (18.5.3):

P[E] 形式的指针元素访问被精确地评估为 *(P + E)。 (...) 指针元素访问运算符不检查越界错误,访问越界元素时的行为未定义。这与 C 和 C++ 相同。

没有区别。

【讨论】:

    【解决方案3】:

    为了阐明数组的[] 运算符和指针(在 dcastro 的回答下讨论)之间的区别,您可以检查以下代码的输出。

    unsafe {
        int[] arr = new[] { 1, 2 };
        fixed(int* ptr = arr) {
            for(int i = 0; i < arr.Length + 1; i++) {
                try { System.Console.WriteLine(*(ptr + i)); } catch(Exception e) { System.Console.WriteLine(e.Message); }
                try { System.Console.WriteLine(ptr[i]); } catch (Exception e) { System.Console.WriteLine(e.Message); }
                try { System.Console.WriteLine(arr[i]); } catch (Exception e) { System.Console.WriteLine(e.Message); }
            }
        }
    }
    

    输出

    1
    1
    1
    2
    2
    2
    0
    0
    Index was outside the bounds of the array.
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-11
      • 2013-01-16
      • 1970-01-01
      • 2022-01-15
      相关资源
      最近更新 更多