C++指针为什么?

hal*_*os1 1 c++ pointers

我对此有点困惑,我需要澄清一下究竟发生了什么.如果有人可以帮助我,我真的很感激.

int i[][3] = {
 { 1, 2, 3 },
 { 4, 5, 6 }
};

int* pointy = &i[1][1];
int* copyPointy = pointy;

*pointy = 100;
pointy = &i[0][2];

cout << *pointy << endl;
cout << *copyPointy << endl;
Run Code Online (Sandbox Code Playgroud)

我想知道以下行代表/意味着什么:

 int* copyPointy = pointy;
Run Code Online (Sandbox Code Playgroud)

我想弄清楚为什么*copyPointy回报100而不是3?如果pointy指向copyPointy,并且如果执行pointy语句时更改的地址pointy = &i[0][2];,则不应该copyPointy更改地址,从而该地址的内容?

Cla*_*diu 6

重要的是要记住指针的值是一个地址 - 它所指向的东西的地址.指针的值是什么,它指向的是两个不同的东西.

让我们标记你的线条:

int i[][3] = {
 { 1, 2, 3 },
 { 4, 5, 6 }
 };

 int* pointy = &i[1][1];
 int* copyPointy = pointy; // (1) 

 *pointy = 100;            // (2)
  pointy = &i[0][2];       // (3)

  cout << *pointy << endl;
  cout << *copyPointy << endl;
Run Code Online (Sandbox Code Playgroud)

后(1)运行时,pointy和copyPointy的值是相同的:两者是相同的地址,即,所述第二阵列的所述第二元件(其中的地址5是).

后(2)执行,在该地址的元素被更改为100 pointy和copyPointy二者之间仍然有相同的地址,所以他们都指向同一件事,其现已成为整数100.

(3)执行之后,pointy现在的值是其他东西 - 即第一个数组的第3个元素的地址(在哪里3).值copyPointy没有改变 - 它没有分配给任何其他东西 - 所以它仍然指向它之前的相同元素,即100.

因此,当您在各自的地址打印值的内容时,您会期望3和100,这就是您所获得的.