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

C++ 指针大小和按引用传递与按指针传递,c++,c,pass-by-reference,sizeof,pass-by-pointer,C++,C,Pass By Reference,Sizeof,Pass By Pointer,我有两个问题: 在4位系统上,指针是4字节,对吗 “通过引用传递”和“通过指针传递”是同一件事,只是措辞不同 在4位系统上,指针大小是4,对吗 如果您的系统有1位字节,那么肯定是这样。(但C不支持字节小于8位的平台。) “通过引用传递”和“通过指针传递”是一回事,但措辞不同吗 否。指针传递是一种模拟引用传递的C方法。指针的大小不一定与CPU的本机字大小相关;例如,最初的Macintosh运行在32位处理器(Motorola 68000)上它只有24个地址行,因此指针被限制为24位。指针值存储在3

我有两个问题:

  • 在4位系统上,指针是4字节,对吗

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

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

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

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


    否。指针传递是一种模拟引用传递的C方法。

    指针的大小不一定与CPU的本机字大小相关;例如,最初的Macintosh运行在32位处理器(Motorola 68000)上它只有24个地址行,因此指针被限制为24位。指针值存储在32位字中,但不使用前8位。一些有进取心的程序员使用前8位存储指针的其他数据。这在68020问世时引起了一些心痛,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
    
    ISWAP
    中的形式参数
    A
    将内存中的同一对象指定为主程序中的
    M
    ,因此写入
    A
    会更改
    M
    中的值。您可以将
    A
    视为指向
    M
    的指针(或者
    A
    M
    都是指向同一对象的指针),但该语言对程序员隐藏了这种指针特性

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

    我们不是将
    m
    n
    传递给
    iswap
    ,而是传递表达式
    &m
    &n
    的结果,它们是指向这两个对象的指针。同样,在
    iswap
    函数中,我们不写入
    a
    b
    ,而是写入表达式
    *a的结果de>和
    *b
    a
    m
    是指内存中两个完全不同的对象,就像
    b
    n
    一样。写入
    a
    完全不会影响
    m

    关于在C中传递的参数,声明:

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


    你的意思是4字节,或者说是32字节,每个人都叫它。代码>引用/代码>,代码>指针,“< /Cord>”,或者“添加”,“代码>传递< /COD>地址。@ sp。通过指针和通过引用不是同一回事。@ SP。任何一个正派的C++人会为此而杀你,但我不是C++程序员,所以我不会。”这个问题很混乱,因为它混淆了C和C++的概念。但实际上,它们是两种截然不同的语言,在概念和语法上有着巨大的差异。@Sp.:在C语言中,函数参数总是按值传递。在C中,通过显式地传递指针值来模拟引用传递。@KingsIndian我也在考虑同样的事情。删除了评论。没有?我认为它不支持任何字符不是字节的系统。一个字节并不总是8位。。。看看80年代的大型机s@ColeJohnson字符在C中总是一个字节。然而,一个字节不必是8位。你说的是八位字节,我知道八位字节和字节的区别。我是说你提到的“C不支持字节小于8位[s]的平台”是不正确的IIRC,因为C只需要
    char
    作为字节,而不是八位字节。我曾指出,80年代的大型机以及类似的大型机不使用8位八位字节。有些使用6位。请随意不同意,但我们可以在一件事上达成一致——一个比特要么高要么低(
    1
    0
    ),这是正确的答案。指针不需要是本机字大小(x86上的本机字通常为16位,而不是32或64位[取决于操作模式])