指针框和圆图

鉴于以下准则

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点。

在此处输入图像描述

以下是我对第2点的看法。 在此处输入图像描述

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

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

步骤1

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

第2步

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

第3步

现在将y的地址放入x指向的位置

第4步

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

第5步

希望这可以帮助。

在第1点:

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

x包含不同动态分配的存储器块的地址(让我们称之为“块B”),“块B”包含“块A”的地址。

C。 z是未初始化的int

在第2点:

一个。 y与第1点相同

z现在包含值3

C。 x仍包含地址“Block B”,但“Block B”现在包含z的地址而不是“Block A”的地址。

从图中可以看出,圆圈是具有自动存储持续时间的变量(即xyz ),矩形是动态分配的内存块:

指针图

没有!! 这应该清除你的怀疑。 考虑address(y)=300, address(z)=400. content(300)=6, content(400)=3 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。

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

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

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