*ptr 和 **ptr 有什么区别?
What are the differences between *ptr and **ptr?
我正在使用三重指针和 malloc 对 3D 数组进行编码。我在下面的代码中用 *ptrdate
替换了 *ptrdate in (a)
、*ptrdate[i]
和 *ptrdate[i]
,因为它们基本上都是 Date 类型的指针,但在不同的维度中访问。我两种方式都得到了相同的结果。
问:作为sizeof的操作数有什么区别?
typedef struct {
int day;
} Date;
int main(){
int i, j, k, count=0;
int row=3, col=4, dep=5;
Date ***ptrdate = malloc(row * sizeof *ptrdate); //(a)
for (i=0; i<row; i++) {
ptrdate[i] = malloc(col * sizeof *ptrdate[i]); //(b)
for (j=0; j<col; j++) {
ptrdate[i][j] = malloc(dep * sizeof *ptrdate[i][j]); //(c)
}
}
I am coding a 3D array using triple pointers with malloc
.
首先,不需要多次调用 malloc
来分配任何数组。事实上,这样做是不正确的,因为单词 "array" 被认为表示单个连续内存块,即 one 分配。我稍后再谈,但首先,你的问题:
Question: what's the difference when used as the operand of sizeof
?
答案虽然显而易见,但常常被误解。它们是不同的指针类型,恰好在您的系统上具有相同的大小和表示形式……但它们在其他系统上可能具有不同的大小和表示形式。牢记这种可能性很重要,这样您就可以确保您的代码尽可能具有可移植性。
给定 size_t row=3, col=4, dep=5;
,您可以像这样声明一个数组:Date array[row][col][dep];
。我知道您在这个问题中不需要这样的声明……请耐心等待。如果我们 printf("%zu\n", sizeof array);
,它会打印 row * col * dep * sizeof (Date)
。它知道数组的完整大小,包括所有维度...这就是确切分配此类数组时需要多少字节。
printf("%zu\n", sizeof ptrDate);
与 ptrDate
声明在你的代码中会产生完全不同的东西,但是......它会产生一个指针的大小(指向指向 [=21= 的指针的指针], 不要与系统上的 指向 Date
的指针或 指向 Date
的指针混淆。所有关于维数(例如 row * col * dep
乘法)的大小信息都丢失了,因为我们没有告诉我们的指针维护该大小信息。但是,我们仍然可以使用 sizeof *ptrDate
找到 sizeof (Date)
,因为我们已经告诉我们的代码保持与指针类型关联的大小信息。
但是,如果我们可以告诉我们的指针来维护其他大小信息(维度)呢?如果我们可以写 ptrDate = malloc(row * sizeof *ptrDate);
,并且 sizeof *ptrDate
等于 col * dep * sizeof (Date)
会怎样?这会简化分配,不是吗?
这让我们回到我的介绍:有一种方法可以使用一个 malloc
来执行所有这些分配。这是一个简单易记的模式,但却是一个难以理解的模式(可能适合问另一个问题):
Date (*ptrDate)[col][dep] = malloc(row * sizeof *ptrDate);
可以这么说,用法基本上还是一样的。您仍然可以像 ptrDate[x][y][z]
这样使用它...不过,有一件事似乎不太正确,那就是 sizeof ptrDate
仍然会产生指针的大小(指向数组[col][ Date
) 的 dep] 和 sizeof *ptrDate
不包含 row
维度(因此上面 malloc
中的乘法。我将把它作为练习留给你找出是否需要解决方案...
free(ptrDate); // Ooops! I must remember to free the memory I have allocated!
int *ptr是指针的声明,存放整型变量的地址,int **ptr是存放整型变量的指针地址的声明。
我正在使用三重指针和 malloc 对 3D 数组进行编码。我在下面的代码中用 *ptrdate
替换了 *ptrdate in (a)
、*ptrdate[i]
和 *ptrdate[i]
,因为它们基本上都是 Date 类型的指针,但在不同的维度中访问。我两种方式都得到了相同的结果。
问:作为sizeof的操作数有什么区别?
typedef struct {
int day;
} Date;
int main(){
int i, j, k, count=0;
int row=3, col=4, dep=5;
Date ***ptrdate = malloc(row * sizeof *ptrdate); //(a)
for (i=0; i<row; i++) {
ptrdate[i] = malloc(col * sizeof *ptrdate[i]); //(b)
for (j=0; j<col; j++) {
ptrdate[i][j] = malloc(dep * sizeof *ptrdate[i][j]); //(c)
}
}
I am coding a 3D array using triple pointers with
malloc
.
首先,不需要多次调用 malloc
来分配任何数组。事实上,这样做是不正确的,因为单词 "array" 被认为表示单个连续内存块,即 one 分配。我稍后再谈,但首先,你的问题:
Question: what's the difference when used as the operand of
sizeof
?
答案虽然显而易见,但常常被误解。它们是不同的指针类型,恰好在您的系统上具有相同的大小和表示形式……但它们在其他系统上可能具有不同的大小和表示形式。牢记这种可能性很重要,这样您就可以确保您的代码尽可能具有可移植性。
给定 size_t row=3, col=4, dep=5;
,您可以像这样声明一个数组:Date array[row][col][dep];
。我知道您在这个问题中不需要这样的声明……请耐心等待。如果我们 printf("%zu\n", sizeof array);
,它会打印 row * col * dep * sizeof (Date)
。它知道数组的完整大小,包括所有维度...这就是确切分配此类数组时需要多少字节。
printf("%zu\n", sizeof ptrDate);
与 ptrDate
声明在你的代码中会产生完全不同的东西,但是......它会产生一个指针的大小(指向指向 [=21= 的指针的指针], 不要与系统上的 指向 Date
的指针或 指向 Date
的指针混淆。所有关于维数(例如 row * col * dep
乘法)的大小信息都丢失了,因为我们没有告诉我们的指针维护该大小信息。但是,我们仍然可以使用 sizeof *ptrDate
找到 sizeof (Date)
,因为我们已经告诉我们的代码保持与指针类型关联的大小信息。
但是,如果我们可以告诉我们的指针来维护其他大小信息(维度)呢?如果我们可以写 ptrDate = malloc(row * sizeof *ptrDate);
,并且 sizeof *ptrDate
等于 col * dep * sizeof (Date)
会怎样?这会简化分配,不是吗?
这让我们回到我的介绍:有一种方法可以使用一个 malloc
来执行所有这些分配。这是一个简单易记的模式,但却是一个难以理解的模式(可能适合问另一个问题):
Date (*ptrDate)[col][dep] = malloc(row * sizeof *ptrDate);
可以这么说,用法基本上还是一样的。您仍然可以像 ptrDate[x][y][z]
这样使用它...不过,有一件事似乎不太正确,那就是 sizeof ptrDate
仍然会产生指针的大小(指向数组[col][ Date
) 的 dep] 和 sizeof *ptrDate
不包含 row
维度(因此上面 malloc
中的乘法。我将把它作为练习留给你找出是否需要解决方案...
free(ptrDate); // Ooops! I must remember to free the memory I have allocated!
int *ptr是指针的声明,存放整型变量的地址,int **ptr是存放整型变量的指针地址的声明。