我正在尝试以免费的双指针来理解代码片段
我想了解以下内容之间的区别。两个片段都来自上述网址
int** pt;
pt = (int*) malloc(sizeof(int)*10);
Run Code Online (Sandbox Code Playgroud)
和
*pt = (int*) malloc(sizeof(int)*10);
Run Code Online (Sandbox Code Playgroud)
你能详细说明一些例子和绘图吗
Joh*_*ode 10
首先,代码片段不好有几个原因——第一个是将结果malloc转换为错误的类型,并且使用错误的类型来计算内存量。修复演员表和类型问题,我们有:
int **pt;
pt = malloc( sizeof *pt * 10 ); // allocate space for 10 int *
*pt = malloc( sizeof **pt * 10 ); // allocate space for 10 int
Run Code Online (Sandbox Code Playgroud)
执行第一行后,您将获得以下内容:
int ** int *
+---+ +---+
pt: | | --------------->| | pt[0]
+---+ +---+
| | pt[1]
+---+
| | pt[2]
+---+
...
+---+
| | pt[9]
+---+
Run Code Online (Sandbox Code Playgroud)
您已为 10 个int *对象留出空间,并pt指向其中的第一个。
下一行
*pt = malloc( sizeof **pt * 10 ); // allocate space for 10 int
Run Code Online (Sandbox Code Playgroud)
为 10 个int对象分配空间,并设置pt[0]指向它们:
int ** int * int
+---+ +---+ +---+
pt: | | --------------->| | pt[0] -------->| | pt[0][0]
+---+ +---+ +---+
| | pt[1] | | pt[0][1]
+---+ +---+
| | pt[2] | | pt[0][2]
+---+ +---+
... ...
+---+ +---+
| | pt[9] | | pt[0][9]
+---+ +---+
Run Code Online (Sandbox Code Playgroud)
这说明了一种分配“锯齿状”数组的方法;您仍然可以将其索引为pt[i][j],但与真正的二维数组不同的是,行在内存中并不相邻,并且每一行的长度可能不同。你通常会写成
pt = malloc( sizeof *pt * ROWS );
if ( pt )
{
for ( size_t r = 0; r < ROWS; r++ )
{
pt[r] = malloc( sizeof *pt[r] * COLS );
}
}
Run Code Online (Sandbox Code Playgroud)
当这一切都完成后,你有这样的事情:
int ** int * int
+---+ +---+ +---+---+ +---+
pt: | | ---------> | | pt[0] --------> | | | ... | | pt[0][0] - pt[0][COLS-1]
+---+ +---+ +---+---+ +---+
| | pt[1] ------+
+---+ | +---+---+ +---+
| | pt[2] ---+ +-> | | | ... | | pt[1][0] - pt[1][COLS-1]
+---+ | +---+---+ +---+
... |
| +---+---+ +---+
+----> | | | ... | | pt[2][0] - pt[2][COLS-1]
+---+---+ +---+
Run Code Online (Sandbox Code Playgroud)