我在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行,我不明白为什么会这样,在()中,指针变量和计数器相互添加
答案 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;
变量指针包含数组第一个元素的地址。 添加计数器表示选择远离起始地址的计数器的地址。
计数器只是偏离指针。