简单的C指针澄清

mas*_*wok 3 c pointers

我刚开始使用C语言中的指针而且我只是简单地挂了一些东西.我想确保我理解正确.

说我有这样的事情:

int *buff;

从我读到的,

*buff refers to the value that buff is currently pointing to
&buff refers to the address

但我坚持的是:

"buff"是指什么?它是指内存中的&buff的位置,它指向值*buff的位置?

谢谢你!:3

-jtsan

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%计算机和微控制器.

您也可以将模型扩展为真正的四字节ints ...

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  ...