指针大小和通行证

我有两个问题:

  • 我是对的,在4位系统上,指针是4个字节?

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


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

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

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

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


    指针的大小不一定与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的形式参数AISWAP指定与主程序中的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*bam表示内存中的两个完全不同的对象,如同bn 。 写入a将不会影响m


    关于C中的参数传递,维基百科在C状态中的条目:

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

    链接地址: http://www.djcxy.com/p/20733.html

    上一篇: Pointer size and Pass

    下一篇: Why and when to pass class types in C++ by pointer?