我有两个问题:
我是否正确,在4位系统上,指针是4个字节?
“通过引用传递”和“通过指针传递相同的东西,只是不同的措辞?
答案 0 :(得分:7)
我是对的,在4位系统上,指针大小为4
如果你的系统有1位字节,那么肯定是。 (但是C不支持字节短于8位的平台。)
是“通过引用传递”和“通过指针传递”相同的东西,但不同的措辞?
没有。 Pass-by-pointer是一种用于模拟传递引用的C方法。 The concept is different.
答案 1 :(得分:2)
指针的大小不一定与CPU的本机字大小相关;例如,原始Macintosh运行在32位处理器(Motorola 68000)上,该处理器只有24个地址线,因此指针限制为24位。指针值存储在32位字中,但未使用前8位。一些有进取心的程序员使用那些前8位来用指针存储其他数据。当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
A
中的形式参数ISWAP
在内存中指定与主程序中M
相同的对象,因此写入A
会更改M
中的值}。您可以将A
视为指向M
的指针(或A
和M
都是指向同一对象的指针),但该语言隐藏了指针的指针程序员。
C通过 value 传递所有内容;形式参数和实际参数总是在内存中指定不同的对象,因此写入一个不会影响另一个。当我们想要修改子例程中的对象时,我们必须使用&
运算符显式传递其地址,然后使用*
运算符在子例程中取消引用它:
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
的结果, *b
。 a
和m
在内存中引用了两个完全不同的对象,b
和n
也是如此。写入a
根本不会影响m
。
答案 2 :(得分:0)
关于C中的参数传递,Wikipedia's entry on C表示:
函数参数始终按值传递。通过显式传递指针值在C中模拟传递引用。