指针大小和通行证
我有两个问题:
我是对的,在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
的形式参数A
在ISWAP
指定与主程序中的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 = %dn", m, n);
iswap(&x, &y);
printf("m = %d, n = %dn", m, n);
return 0;
}
不是将m
和n
传递给iswap
,而是传递表达式&m
和&n
,它们是指向两个对象的指针。 同样,在iswap
函数中,我们不写入a
或b
,而是写入表达式*a
和*b
。 a
和m
表示内存中的两个完全不同的对象,如同b
和n
。 写入a
将不会影响m
。
关于C中的参数传递,维基百科在C状态中的条目:
函数参数总是按值传递。 传递引用是通过显式传递指针值在C中模拟的。
链接地址: http://www.djcxy.com/p/20733.html