0

我有两个问题:

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

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

4

3 回答 3

7

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

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

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

不,指针传递是一种模拟引用传递的 C 方法。概念不同。

于 2013-01-29T22:52:32.463 回答
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

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

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

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;
}

我们没有传递mand n,而是传递表达式iswap的结果and ,它们是指向两个对象的指针。同样,在函数中,我们不写入or ,我们写入表达式and的结果。 并引用内存中两个完全不同的对象,如 do和. 写入不会有任何影响。 &m&niswapab *a*bambnam

于 2013-01-29T23:47:54.607 回答
0

关于 C 中的参数传递,维基百科关于 C 的条目指出:

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

于 2013-01-30T00:48:21.520 回答