指针框和圆图

时间:2014-10-19 13:57:51

标签: c pointers

鉴于以下代码

int main()
{
  int z;
  int **x;
  int * y;

  x = (int**)malloc(sizeof(int*));
  y = (int*)malloc(sizeof(int));
  *y = 6;
  *x = y; // Point 1
  z = 3;
  *x = &z; // Point 2
}

我将在第1点和第2点绘制变量的方框图。

以下是我得到的第1点。

enter image description here

以下是我对第2点的看法。 enter image description here

任何人都可以确认我的方法是否正确以及我的解决方案?抱歉,我是指针和c的新手。

4 个答案:

答案 0 :(得分:2)

让我们一步一步来。首先,我们在堆栈上为变量保留了几个位置。

Step 1

接下来,分配一个int指针大小的小块。

Step 2

新分配的块最终应该分配一个int的地址,因为X是指向int的指针。接下来,分配另一个小块。

Step 3

现在将y的地址放入x

指向的位置

Step 4

最后,将3分配给z并更改x指向的值,现在将是z的地址。

Step 5

希望这有帮助。

答案 1 :(得分:1)

第1点:

一个。 y包含动态分配的内存块的地址(让我们称之为"块A"),其中包含值6

x包含不同动态分配的内存块的地址(让我们称之为"块B")和"块B"包含"块A"的地址。

℃。 z是未初始化的int

第2点:

一个。 y与第1点相比没有变化

z现在包含值3

℃。 x仍然包含地址" B"但是" B" B"现在包含z的地址,而不是"地块A"的地址。

如图所示,其中圆圈是具有自动存储持续时间的变量(即xyz),矩形是动态分配的内存块:

Pointer diagram

答案 2 :(得分:0)

我并不完全熟悉这一点,但x是指向指针指向int的类型 - 两层间接。 Y是指向int的类型 - 一层。但是,该图显示它们都具有来自底层存储的相同间接。你可以在第二个图中执行此操作,其中您获取z的地址,但是获取z的地址与将y分配给* x具有相同的间接级别,因为在两种情况下,您都告诉x指向内存地址这直接指向记忆。

简而言之,我认为你的“第1点”图应该类似于你的“第2点”图,x的“指针框”指向y的“指针框”。

编辑:我也不确定“第2点”图表,因为它似乎暗示x是指向int的指针,因为它的指针直接指向z的内存 - 但是我已经很久了已经看过盒子和指针图(这基本上似乎是),知道是否有另一种方法来添加间接层。我实际上认为“Z”和“3”应该在同一个框中框和指针图,因为z直接引用底层存储。

答案 3 :(得分:0)

NO !!这应该清除你的怀疑。考虑address(y)=300, address(z)=400. content(300)=6, content(400)=3

*x = y; // Point 1

上述声明表示指针x的内容将是y的地址。所以指针x指向指针y。 (即content(x)=300

*x = &z; // Point 2

上述声明表示指针x的内容将是z的地址。所以指针x指向指针z。 (即content(x)=400

注意:为了访问您必须执行**x的值,最终将访问这些值。 我们知道(*)是解除引用运算符。 现在让我们尝试使用上面的术语来访问这些值。

第1点: **x => *(*x) => *(address(y)) => *(300) => content(300) => 6。

第2点: **x => *(*x) => *(address(z)) => *(400) => content(400) => 3。