Cra*_*rks 10
int *
表示"指向int的指针".所以,这里buff
是一个指向int的指针.为了简单起见,我们也说:
int x = 5;
int *buff = &x;
Run Code Online (Sandbox Code Playgroud)
x
,一个整数,设置为5.
&x
表示"x的地址".所以buff
包含了地址x
.为了论证,让我们说它x
存储在内存地址0x1000.所以buff
它本身也是一个数字:0x1000.
*buff
意思是"buff指向的东西",在这种情况下为5.
&buff
表示"buff的地址":数字buff
本身存储在内存中的地址.
我想分享一下我用来了解指针在我开始时如何工作的一般技巧.
拿一张大方格纸,纵向放在你面前的桌子上.这是你电脑的记忆.每个框表示一个字节.选择一行,并将数字"100"放在最左边的框下方.这是内存的"最低地址".(我选择100作为非0的任意数字,您可以选择另一个.)从左到右按升序对数字进行编号.
+---+---+---+---+---+-- | | | | | | ... +---+---+---+---+---+-- 100 101 102 103 104 ...
现在,暂时假装int是一个字节大小.你是一台八位电脑.把你int a
写进其中一个盒子里.方框下面的数字是它的地址.现在选择另一个框来包含int *b = &a
.int *b
也是存储在内存中某处的变量,它是一个包含的指针,&a
发音为"a的地址".
int a = 5;
int *b = &a;
Run Code Online (Sandbox Code Playgroud)
a b +---+---+---+---+---+-- | 5 | |100| | | ... +---+---+---+---+---+-- 100 101 102 103 104 ...
现在,您可以使用此模型直观地处理您看到的值和指针的任何其他组合.这是一个简化(因为正如语言学者会说,指针不一定是地址,内存不一定是顺序的,并且有堆栈,堆和寄存器等等),但这是一个非常好的类比,99%计算机和微控制器.
您也可以将模型扩展为真正的四字节int
s ...
int a = 5;
char b = 2;
Run Code Online (Sandbox Code Playgroud)
a a a a b +---+---+---+---+---+-- | 0 | 0 | 0 | 5 | 2 | ... +---+---+---+---+---+-- 100 101 102 103 104 ...