(const int *)与数组的组合

时间:2014-11-05 22:22:20

标签: c++ pointers

我正在用cbook学习c ++。 我的指针有很多问题......

int i;
cin >> i;
const int *quantity = &i;

int array[*quantity];

这是对的吗?我可以在程序运行期间控制数组的大小吗?

3 个答案:

答案 0 :(得分:1)

这几乎是正确的,除了在编译时必须知道数组的大小(你在这里试图在堆栈上分配),所以不,你不能这样做这样做。

但是,你可以使用new[]在运行时分配一个数组,这样你就可以传入一个不是编译时常量的大小(new在堆上分配):

int* array = new int[*quantity];
// ...
delete[] array;    // Manual allocations with `new` require manual deallocations

请注意,在您的特定代码示例中,根本不需要使用指针 - 您可以直接使用i

int* array = new int[i];

答案 1 :(得分:0)

不,这是不正确的。数组大小必须是常量表达式,这意味着它可以在编译期间进行评估,而对于您的代码则不是这样。

如果您想要不同大小的数组,可以使用动态分配:

int* array = new int[i];

或者更好地使用std::vector

std::vector<int> array(i);

答案 2 :(得分:0)

数组在内存中是固定大小的。因为数组也代表内存中对象的连续块,根据定义,相同的数组不能改变内存中的大小,因为它需要移动甚至可能不属于同一应用程序的内存。

有很多方法可以移动你的数组,然而,当它被填满时将它复制到一个有更多空间的新数组,并且有更多可变类型,例如std::Vector,但是这里定义的数组不能改变大小。

此代码将改为做什么

  • i
  • 中放置一个值
  • 在代表quantity
  • 地址(指针)的i中放置一个值
  • 使用地址quantity
  • 中的值创建新数组

请注意,指针是地址,具体是说给定变量的RAM中的字节地址(例如,尝试直接打印指针!)。 *&运营商会快速说出“#34;在地址获得价值&#34;和&#34;获取&#34;

的地址