嗨,我对数组有点困惑。我试着搜索了一下,但没有找到我想要的答案。
对这样的数组感到困惑:
Item **queue;
这是否意味着项目正在为队列创建一个2d数组?阵列会是什么样子?请给我一个关于这一切的简要解释。感谢
Item **queue;
它不是一个数组。它是指向某个项的指针的指针。您可以使用它来引用包含指向Items的指针数组的内存位置。
这是否意味着项目正在为队列创建一个2d数组?
没有。当您声明指向指针的指针时,不会创建任何数组。您只需创建一个指针,可能引用一个2d数组。2d阵列的创建取决于开发人员。
这是一个如何初始化队列的示例:
int main()
{
Item * array_1 = new Item[2]; // array of Items
Item * array_2 = new Item[2]; // array of Items
Item * array_3 = new Item[2]; // array of Items
Item ** queue = new Item*[3]; // array of pointers
queue[0] = array_1;
queue[1] = array_2;
queue[1] = array_3;
delete queue[0];
delete queue[1];
delete queue[1];
delete queue;
}
注意,我使用C++中的运算符new
在堆中创建一个2d数组。
您提供的示例
Item **queue;
不是数组,而是指针对指针,但是您可以将数组的地址分配给指针(就像使用任何指针一样)。
所以有人创建了一个像这样的数组
Item* queues[100]; // An array of pointer to Item
您可以将指针分配给一个指针,例如
Item* queues[100]; // An array of pointer to Item
Item **queuepointers;
// .. assume that the queues pointers is allocated by some code here...
// ... then
queuepointers = queues;
queues[50]->someMethodInItem();
这是关于变量、指针和数组的解释。
在C++中,变量存储在内存中。内存中的数据有值和地址。CPU不知道变量名,只知道内存地址。编译代码时,编译器(实际上是链接器)会将变量名(也称为符号)更改为分配给该变量的实际内存地址。因此,当你在代码中检索变量的值时,实际发生的是告诉CPU地址,CPU检索存储在该地址内存中的数据。
地址只是32位或64位(基于您的CPU体系结构)无符号整数。因此,变量也可以包含其他变量的地址,称为指针。指针也是变量,唯一的区别是指针是32位或64位无符号整数,其数据是其他地方的地址。
当您声明像float *a
这样的变量时,这意味着a
是指向float
类型变量的指针。所以a
的值不是浮点数,而是一个无符号整数。要更改a
所指向的位置,只需像a = &my_float_var;
一样为a
赋值即可。请注意,我使用&
来获取变量my_float_var
的地址。
对于数组,它们只是相邻分配的多个变量。例如,我们声明了一个数组int arr[10]
,假设第一个元素arr[0]
的地址是100
,那么第二个元素arr[1]
的地址就是104
(一个int
是4字节,地址是以字节为单位测量的)。如果在代码中放入不带括号的arr
,则表示数组的地址,即第一个元素的地址。
您可以看到数组和指针是相似的。您可以声明如下的字符数组:
char str1[] = "some string";
char *str2 = "some string";
这两种方法都很好。只有str1
是一个符号,您不能更改它的值(它指向的位置),但您可以更改str2
的值,使其指向另一个字符串。
回到您的问题,Item **queue
可以是类型为Item *
的指针,也可以是类型Item *
的数组。类型Item *
可以是类型Item
的指针或类型Item
的数组。
因此,如果queue
是Item *
类型的阵列,而该阵列的每个元素指向Item
类型的另一个阵列,则queue
可以被认为是2d阵列。但这与传统的2d阵列不同。传统的2d数组使用arr[1,2]
的语法来访问元素,但是访问queue
的元素应该使用queue[1][2]
。