简单的C指针澄清

时间:2011-01-05 06:20:15

标签: 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

5 个答案:

答案 0 :(得分:10)

int *表示“指向int的指针”。所以,在这里,buff是指向int的指针。为了简单起见,我们也说:

int x = 5; 
int *buff = &x;

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;
  a       b 
+---+---+---+---+---+--
| 5 |   |100|   |   | ...
+---+---+---+---+---+--
 100 101 102 103 104  ...

现在,您可以使用此模型直观地处理您看到的值和指针的任何其他组合。这是一种简化(因为正如语言学者所说,指针不是必然一个地址,内存不是必然顺序,并且有堆栈和堆和寄存器等等,但对于99%的计算机和微控制器来说,这是一个相当不错的类比。

你也可以扩展真正的四字节int的模型......

int a = 5;
char b = 2;
  a   a   a   a   b
+---+---+---+---+---+--
| 0 | 0 | 0 | 5 | 2 | ...
+---+---+---+---+---+--
 100 101 102 103 104  ...

答案 1 :(得分:4)

鉴于声明:

int value = 13;
int *buff = &value;

你是对的:

*buff == 13

因为buff指向value且包含13。

你可能误解了&buff所指的内容;它是变量buff的地址,因此&buff的类型是int **,指向整数的指针。相比之下,&value是变量value的地址;它的类型为int *(因此初始化不需要任何强制转换 - 它的类型正确存储在buff中)。

普通buffint *或指向整数的指针。它包含变量value的地址。

答案 2 :(得分:3)

  

* buff指的是buff当前指向的值

  

& buff指的是地址

即可。如果你在想我认为你在想什么,至少不会。 &buff 指的是当前指向的地址,&buff指的是buff本身所在的内存中的地址。

  

“buff”指的是什么?

buff指的是您认为&buff的内容,即buff指向的地址。指针的值是它指向的地址。

以下是一些可以帮助您的示例:

  1. int *buff; - 声明指针 to int 目前没有 指向任何地方
  2. int foo; buff = &foo; - 指向buff foo的地址
  3. *buff = 5; - 改变 什么buff指向(foo)到5
  4. 内容
  5. int **buff_ptr = &buff; - 声明 指向指向int 的指针的指针 并指出它的地址 浅黄色

答案 3 :(得分:3)

buff被声明为“指向int的指针”。使用* buff就像说“什么buff指向”,即int值。使用& buff就像说“buff的地址”,它是指针的地址,指向int(另一个间接层)。

答案 4 :(得分:1)

您的正确性是*buff指的是buff指向的位置,但&buff指的是buff本身的地址&指向(buff)的数据的地址(*)为*&buff,或更常见的是buff

祝你好运。指针非常棘手,但你看起来像是在正确的轨道上。