2016-09-07 64 views
2

IM YouTube上观看https://www.youtube.com/watch?v=8XAQzcJvOHk动态分配阵列本教程根据在C++用户输入动态分配阵列根据在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} 

IM停留在第16行,我不明白为什么是,内部的(),指针变量和计数器被添加到彼此

+3

'*(指针+计数器)'是另一种(也更奇怪)的方式来写'指针[计数器]'。目前还不清楚为什么作者选择以这种方式混淆事件。无论如何,使用'std :: vector '代替原始指针和手动内存管理会更好。 –

+2

在实际的代码中,这应该是'std :: vector'。 –

+3

虽然我给出了主动编码建议:在使用它之前不要定义“指针”,即int * pointer = new int [input];';并在'for'循环体内定义'temp',因为这是它唯一使用的地方。 –

回答

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个单元格以存储完整信息。因此数据将在单元格0x01, 0x02, 0x03, 0x04中“分割”。

指针将指向的数据的第一存储器位置,并占领由指针的类型给定细胞的(在这种情况下指针int所以编译器知道的信息从小区0x01开始和结束0x04)的数目。

A 变量指针可以在算术表达式中进行评估,例如总和和差。

佛例如:

ptr + 10 
ptr - 10 

简单地说,该表达的意思是访问从存储在ptr的地址开始和跳跃10INT细胞向前或向后的存储器地址。

注意注意:表达并不意味着简单的价值添加到地址获得一个新的地址。

事实上,假设ptr = 0x01,则表达式:

ptr + 10; 

并不意味着0x01 + 10 = 0xa

取而代之的是,跳转10个“块”的大小等于指针本身指向的类型大小 。

也就是0x01 + 10 * 4bytes。 由于ptr是一个指向int,然后+10意味着“加整数10块”,并且,在这个例子中,每个int占用4个字节(32位)。


最后,表达:

*(pointer + counter) = temp; 

装置从pointer访问地址开始和添加的int#counter块,则尊重该地址与operator*和在该地址的值写temp

这符号可以与operator[]轻松简化:

pointer[counter] = temp; 

的意义在哪里是完全一样的,但所用的符号更具可读性,尤其是当你有数组做。

+0

当最小的可寻址内存位置是'字节'时,从位开始很奇怪。 – knivil

1

这部分:

*(pointer + counter) 

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

1

*(pointer + counter)如已经指出相当于pointer[counter],它的等效的原因是因为指针指向一个内存地址,当你添加说1到内存地址你INFACT添加任何数据类型的大小指针指向是,乘以1

如果你有一个基本数组

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

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

1
*(pointer + counter) = temp; 

是相同

pointer[counter] = temp; 

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

计数器只是从指针的偏移量。