指针大小和Pass-by-Reference与Pass-by-P​​ointer

时间:2013-01-29 22:48:42

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

我有两个问题:

  1. 我是否正确,在4位系统上,指针是4个字节?

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

3 个答案:

答案 0 :(得分:7)

  

我是对的,在4位系统上,指针大小为4

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

  

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

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

答案 1 :(得分:2)

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

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

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

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

在pass-by-reference系统中,函数定义中的形式参数和函数调用中的实际参数指定相同的内存(或至少更改)一个反映在另一个)。看一些老式的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

A中的形式参数ISWAP在内存中指定与主程序中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的结果, *bam在内存中引用了两个完全不同的对象,bn也是如此。写入a根本不会影响m

答案 2 :(得分:0)

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

  

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