指针框和圆图
鉴于以下准则
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的新手。
让我们一步一步来。 首先,我们在堆栈上为变量保留了一些位置。
接下来,分配一个int指针大小的小块。
新分配的块最终应该分配一个int的地址,因为X是指向int的指针。 接下来,分配另一个小块。
现在将y的地址放入x指向的位置
最后,将3分配给z并更改x指向的值,该值现在将是z的地址。
希望这可以帮助。
在第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”的地址。
从图中可以看出,圆圈是具有自动存储持续时间的变量(即x
, y
和z
),矩形是动态分配的内存块:
没有!! 这应该清除你的怀疑。 考虑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直接引用底层存储。