恒定大小的数组int x[20]
是否小于动态数组int * x = new int[20]
,因为动态数组是一个占用空间的指针?或者,恒定大小的数组也是一个指针?为什么或为什么不呢?
另一个问题:在32位机器上,我从未100%肯定的东西是32位长的指针?当指向存储它们的RAM中的位置时,指针的处理方式与常规变量相同吗?
非常感谢帮助。
答案 0 :(得分:1)
动态数组不是指针 - 但您确实需要指针和数组,因此分配的版本使用更多空间。分配版本的优点是您可以分配正确的空间量,而不是分配比通常使用的空间更多的空间(例如,您可以精确分配37个整数,而不是仅在大小为的情况下分配100个整数)大100)。
是的,32位机器有32位指针,基本上没有例外。
是的,当位于RAM中时,指针与其他变量的处理方式相同。
答案 1 :(得分:1)
恒定大小的数组int x [20]是否小于动态数组int * x = new int [20],因为动态数组是一个占用空间的指针?
必须存储两者的存储器地址,无论是常量大小数组中第一个元素的偏移量还是动态数组的指针。数组本身大小相同(我相信)其他数据也是如此。
常量大小的数组变量x
可以某种方式使用,类似于指针,但不是指针本身,它是一个数组。
32位和64位通常是指存储器寻址,因此32位系统上的指针为32位,64位指针为64位。
指针非常像整数,并以相同的方式存储在内存中(您可以将32位计算机上的指针转换为双字,并且不会丢失信息)。它们只是在存储实际数据的其他地方引用内存中的偏移量。
答案 2 :(得分:1)
动态的将使用更多的内存;还有多少取决于指针的大小和内存分配器元数据的大小。
在任何现代机器上,正如@Jonathan所说,32位机器使用32位指针,并且在处理指针与数据的方式上没有显着差异(除堆栈与堆之外)。较旧的机器(如果你使用拆分指令和数据空间构建“真实模式”,甚至更新的机器)将区分功能和数据指针,但不区分它们本身就是它们所指向的地址空间。
一些非常古老的机器和一些实验性架构 - 您可能不会遇到这些机器 - 实际上管理指针,有时管理数据不同; Emacs对整数的历史处理(窃取一个或多个位用于内部使用)反映了在一些旧架构上使用“标记位”。您可能偶尔会遇到(大多数是较旧的)程序,这些程序“知道”指针应该在4字节边界上对齐,并为了其他目的借用底部2位指针(垃圾收集状态是常用的)。
答案 3 :(得分:0)
我的理解是,常量大小的数组名是指向数组中第一项的指针(基本上)
答案 4 :(得分:0)
这取决于你想知道的大小。
在x
的情况下,变量int* x = new int[20]
的大小肯定会更小。在这种情况下,x
只是一个指针,因此具有指针大小(32位系统通常为4个字节,64位系统为8个字节)。在另一种情况下,x
实际上是一个长度为20的静态分配数组,因此它的大小为sizeof(int) * 20
。
如果你在谈论实际数组的大小,尽管没有区别。问题是它将在何处分配。在int x[20]
中,它通常在堆栈上,而指针版本将在堆上