【问题标题】:Pointer size and Pass-by-Reference vs. Pass-by-Pointer指针大小和引用传递与指针传递
【发布时间】:2013-01-13 15:33:17
【问题描述】:

我有两个问题:

  1. 我说的对吗,在 4 位系统上,指针是 4 个字节?

  2. “通过引用传递”和“通过指针传递”是同一个东西,只是措辞不同吗?

【问题讨论】:

  • 您的意思是 4 个字节,或者每个人都称之为 32 位。这些都是一样的:pass by referencepass by pointer",或者,我补充说,pass the address of
  • @Sp。指针传递和引用传递不是一回事。
  • @Sp。任何体面的 C++ 人都会为此杀了你,但我不是 C++ 程序员,所以我不会。 But read this.
  • @Sp。还有 C。这个问题非常令人困惑,因为它混淆了 C 和 C++ 的概念。但在实践中,它们是两种截然不同的语言在概念和句法上存在巨大差异。
  • @Sp.:在 C 中,函数参数总是按值传递。通过显式传递指针值在 C 中模拟传递引用。

标签: c++ c pass-by-reference sizeof pass-by-pointer


【解决方案1】:

关于 C 中的参数传递,Wikipedia's entry on C 声明:

函数参数总是按值传递。在 C 中通过显式传递指针值来模拟传递引用。

【讨论】:

    【解决方案2】:

    指针的大小不一定与 CPU 的本机字大小相关;例如,最初的 Macintosh 在只有 24 条地址线的 32 位处理器(摩托罗拉 68000)上运行,因此指针被限制为 24 位。指针值存储在 32 位字中,但没有使用前 8 位。一些有进取心的程序员使用前 8 位来存储其他数据和指针。当 68020 出现时,这引起了一些胃灼热,它有 32 个地址行。重写该代码以使其“32 位干净”需要一段时间。

    还要注意,指向不同类型的指针不必具有相同的大小。

    实际上,在任何现代桌面系统(阅读:x86)上,所有指针类型都是 32 位或 64 位宽。但不要依赖于所有架构都是如此。

    至于“通过引用传递”和“通过指针传递”,不,它们不仅仅是同一个概念的不同措辞。

    在按引用传递系统中,函数定义中的形参和函数调用中的实参指定相同的内存(或至少改变一个反映在另一个上)。查看一些老式的 Fortran 代码:

    C234567890
          PROGRAM CALLSW
          INTEGER M, N
    
          M = 1
          N = 2
    
          WRITE(*,*) M, N
          CALL ISWAP(M, N)
          WRITE(*,*) M, N
    
          STOP
          END
    
    C234567890
          SUBROUTINE ISWAP(A, B)
          INTEGER A, B
          INTEGER TMP
    
          TMP = A
          A = B
          B = TMP
    
          RETURN
          END
    

    ISWAP 中的形参A 与主程序中的M 指定内存中的相同对象,因此写入A 会更改M 中的值。您可以将A 视为指向M 的指针(或者AM 都是指向同一个对象的指针),但是该语言对程序员隐藏了这种指针。

    C 通过 value 传递所有内容;形参和实参总是在内存中指定不同的对象,所以写入一个不会影响另一个。当我们想在子例程中修改一个对象时,我们必须使用& 操作符显式传递它的地址,然后在子例程中使用* 操作符取消引用它:

    void iswap(int *a, int *b)
    {
      int tmp;
    
      tmp = *a;
      *a = *b;
      *b = tmp;
    }
    
    int main(void)
    {
      int m, n;
    
      m = 1;
      n = 2;
    
      printf("m = %d, n = %d\n", m, n);
      iswap(&x, &y);
      printf("m = %d, n = %d\n", m, n);
    
      return 0;
    }
    

    我们没有将mn 传递给iswap,而是传递表达式 &m&n 的结果,它们是指向这两个对象的指针。同样,在iswap 函数中,我们不会写入ab,而是写入表达式 *a*b 的结果。 am 指的是内存中两个完全不同的对象,bn 也是如此。写信给a 根本不会影响m

    【讨论】:

    • 这是正确答案。指针不需要是 native 字长(作为 x86 上的字,native 通常是 16 位,而不是 32 或 64 [取决于操作模式])
    【解决方案3】:

    我说得对吗,在 4 位系统上,指针大小是 4

    如果您的系统有 1 位字节,那么肯定是。 (但 C 不支持字节短于 8 位的平台。)

    “通过引用传递”和“通过指针传递”是同一个东西,但措辞不同吗?

    没有。 Pass-by-pointer 是一种用于模拟 pass-by-reference 的 C 方法。 The concept is different.

    【讨论】:

    • @KingsIndian 我也在考虑同样的事情。删除了评论。
    • 没有?我认为它不支持char 不是字节的任何系统。一个字节并不总是 8 位......看看 80 年代的大型机
    • @ColeJohnson char 在 C 中始终是一个字节。但是,一个字节不必是 8 位。你说的是八位字节。
    • 我知道八位字节和字节之间的区别。我是说您提到“C 不支持字节短于 8 位 [s] 的平台”是不正确的 IIRC,因为 C 只需要 char 是一个字节,而不是八位字节。我指出 80 年代的大型机等不使用 8 位八位字节。有些使用6位。随意不同意,但我们可以在一件事上达成一致 - 有点高或低(分别为10
    猜你喜欢
    • 2015-02-11
    • 2019-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-26
    • 1970-01-01
    • 2013-12-24
    • 2012-01-24
    相关资源
    最近更新 更多