根据C ++中的用户输入动态分配数组

时间:2016-09-07 13:47:25

标签: c++

我在youtube上观看本教程https://www.youtube.com/watch?v=8XAQzcJvOHk根据C ++中的用户输入动态分配数组

这是他的代码

1 int main()
2 {
3   int *pointer = nullptr;
4   
5   cout << "how many items u are gonna enter" << endl;
6   int input;
7   cin >> input;
8
9   pointer = new int[input];
10
11  int temp;
12
13  for (int counter = 0; counter < input; counter++) {
14      cout << "enter the item " << counter + 1 << endl;
15      cin >> temp;
16      *(pointer + counter) = temp;
17  }
18
19  cout << "the items you have entered are" << endl;
20  for (int counter = 0; counter < input; counter++) {
21      cout << counter + 1 << "  item is  " << *(pointer + counter) << endl;
22  }
23
24  delete[]pointer;
25
26  return 0;
27}

我陷入了第16行,我不明白为什么会这样,在()中,指针变量和计数器相互添加

4 个答案:

答案 0 :(得分:2)

Pointer Arithmetic是一个很好的起点。

我将尝试简要解释一下它是如何工作的,但我强烈建议您将这些概念与好的书籍或互联网参考资料整合起来,因为它们对于正确处理指针非常重要。

指针(从名称可以想象)指向存储单元格:

int* ptr = /*an address to the memory cell*/

你的记忆由顺序单元格组成,图形化:

Address|      Value
-------|------------
0x00   |    [#some value] 8 bit
0x01   |    [#some value] 8 bit
...    |    ...
0xN    |    [#some value] 8 bit

为了使这个例子不那么长,我们可以假设每个单元包含8位,整数值用32位表示(通常不是这样,它取决于机器架构和编译器)。

然后int值完全存储在4个单元格中。 (我们明确地不考虑内存对齐)。

所以你的指针包含一个内存位置,内存中的地址包含你已经分配的值(使用动态内存)。

例如:

int* ptr = 0x01

这意味着存储在内存中某处的变量ptr包含地址0x01。在存储器单元0x01中,将存在动态分配的整数值。

但是,由于该值是整数类型,因此数据将采用4个单元格来存储完整信息。因此,数据将被分成&#34;在单元格0x01, 0x02, 0x03, 0x04中。

指针将指向数据的第一个内存位置,并且指针类型给出了单元占用的数量(在这种情况下指针int,因此编译器知道信息从单元{{1}开始结束0x01)。

变量指针可以用算术表达式计算,例如总和和差异。

例如:

0x04

简单地说,该表达式的含义是从存储在ptr + 10 ptr - 10 中的地址开始访问内存地址,并向前或向后跳转ptr int cells

注意注意:表达式意味着只需将值添加到获取新地址的地址即可。

确实,假设10,则表达式为:

ptr = 0x01

并不意味着 ptr + 10;

相反,这意味着跳过10&#34;阻止&#34;大小等于类型的大小 指针本身指向。

0x01 + 10 = 0xa。 由于0x01 + 10 * 4bytes是指向ptr的指针,因此int表示&#34;加上10个整数块&#34; ,并且在此示例中,每个+10占用4个字节(32位)。

总结一下,表达式:

int

表示从*(pointer + counter) = temp; 开始访问地址并添加pointer #counter块,然后使用int推断该地址,并在该地址中写入值{ {1}}。

使用operator*

可以轻松简化该表示法
temp

其中含义完全相同,但符号更具可读性,尤其是在您必须使用数组时。

答案 1 :(得分:1)

这部分:

*(pointer + counter)

只是简单的指针算法:我们将counter(类型为int)添加到指针地址,然后使用*取消引用它。 pointer[counter] 相同。在那之后,我们将temp的savig值放入内存中的特定(解除引用)位置。

答案 2 :(得分:1)

正如已经指出的那样,

*(pointer + counter)相当于pointer[counter],它等效的原因是因为指针保存了一个内存地址,当你将1添加到该内存地址时infact添加指针所指向的数据类型的大小,乘以1.

如果你有一个原始数组

int arr[2] = {1,55};

*arr会给你1而*(arr + 1)会给你55

答案 3 :(得分:1)

  *(pointer + counter) = temp;

相同
pointer[counter] = temp;

变量指针包含数组第一个元素的地址。 添加计数器表示选择远离起始地址的计数器的地址。

计数器只是偏离指针