指针大小和按引用传递与按指针传递

Pointer size and Pass-by-Reference vs. Pass-by-Pointer

本文关键字:指针 按引用传递      更新时间:2023-10-16

>我有两个问题:

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

  2. "通过引用传递"
  3. 和"通过指针传递"是一回事,只是措辞不同吗?

我是否正确,在 4 位系统上指针大小为 4

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

"

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

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

指针的大小不一定与CPU的本机字大小相关;例如,最初的Macintosh运行在32位处理器(摩托罗拉68000)上,该处理器只有24个地址行,因此指针被限制为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 按传递所有内容;形式参数和实际参数总是指定内存中的不同对象,因此写入一个不会影响另一个对象。 当我们要修改子例程中的对象时,我们必须使用 & 运算符显式传递其地址,然后在子例程中使用 * 运算符取消引用它:

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 = %dn", m, n);
  iswap(&x, &y);
  printf("m = %d, n = %dn", m, n);
  return 0;
}

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

关于 C

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

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