鉴于以下代码
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的新手。
答案 0 :(得分:2)
让我们一步一步来。首先,我们在堆栈上为变量保留了几个位置。
接下来,分配一个int指针大小的小块。
新分配的块最终应该分配一个int的地址,因为X是指向int的指针。接下来,分配另一个小块。
现在将y的地址放入x
指向的位置
最后,将3分配给z并更改x指向的值,现在将是z的地址。
希望这有帮助。
答案 1 :(得分:1)
第1点:
一个。 y
包含动态分配的内存块的地址(让我们称之为"块A"),其中包含值6
湾x
包含不同动态分配的内存块的地址(让我们称之为"块B")和"块B"包含"块A"的地址。
℃。 z
是未初始化的int
第2点:
一个。 y
与第1点相比没有变化
湾z
现在包含值3
℃。 x
仍然包含地址" B"但是" B" B"现在包含z
的地址,而不是"地块A"的地址。
如图所示,其中圆圈是具有自动存储持续时间的变量(即x
,y
和z
),矩形是动态分配的内存块:
答案 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。