指针地址与指针

时间:2017-10-18 15:50:27

标签: c++ pointers

考虑这个C ++程序:

#include<iostream>
using namespace std;

int main() {
    int x = 7;
    int *ip = &x;
    cout << "the value of x is " << x <<endl;
    cout << "the address of x is " << &x <<endl;
    cout << "the address stored at ip is "<< ip <<endl;
    return 0;
}

这是我得到的输出:

the value of x is 7
the address of x is 0x28ff08
the address stored at the pointer is 0x28ff08

这对我有意义。但是,如果我将代码更改为以下内容,则会得到一组不同的输出:

#include<iostream>
using namespace std;

int main() {
    int x = 7;
    int *ip = &x;
    cout << "the value of x is " << x <<endl;
    cout << "the address of x is " << &x <<endl;
    cout << "the address of the ip itself is "<< &ip <<endl;
    return 0;
}

现在,我收到了这个输出:

the value of x is 7
the address of x is 0x28ff0c
the address of the ip itself is 0x28ff08

在第一个代码中,变量x的地址和指针ip中存储的地址是相同的,这对我来说很有意义。但在第二个程序中,ip本身的地址保持不变,但x的地址似乎正在改变,我觉得这令人困惑。我期望变量x的地址与第一个程序中的地址和要更改的指针的地址保持一致。

有人可以解释这里发生了什么吗?

2 个答案:

答案 0 :(得分:1)

第一个代码中的值是相同的,因为ip的值是x的地址(同样的事情,ip保持x的地址)。但在第二个代码中结果是不同的,因为x的地址不是ip的地址(ip是不同的变量 - 指针能够容纳其他变量的地址)。计算机将决定创建它们 - 谁知道。我认为这只是巧合,其中一个变量是在同一个地址上创建的,第二个是在不同的地址上创建的。

答案 1 :(得分:1)

我认为你可能会对指针对象的值,指针对象的地址,指针的值和指针的地址感到困惑。我认为最好通过图片来解释。如果你写

int  x  = 7;
int* ip = &x;

然后,在内存中,事情看起来像这样:

  +-----------+                 +-----------+
  |     7     |  <------------  | Address A |
  +-----------+                 +-----------+
      int x                        int* ip
    Address A                     Address B

此处,变量x存储在某个位置(称为A),并保存值7。变量ip存储在某个位置(称为B),并将其值保存为地址A。请注意,AB必须彼此不同,因为xip占用了不同的内存位置。

现在,想想你写的时候会发生什么

cout << x << endl;

这会打印出x中存储的值7。 (我认为这并不奇怪。)

如果你写

cout << &x << endl;

您正在打印x所在的地址。这将是A恰好是什么价值,并且从程序运行到程序运行都会有所不同。

如果你写

cout << ip << endl;

您正在打印ip中存储的值。由于ip指向xip中存储的值是x的地址,而A恰好是cout << &ip << endl;

但是,如果你写

ip

您正在打印B变量的地址。该地址由A表示,它取决于程序的特定运行。请注意,B +-----------+ +-----------+ | 7 | <------------ | Address A | +-----------+ +-----------+ int x int* ip Address A Address B cout << x << endl; // Prints 7, the contents of x. cout << &x << endl; // Prints A, the address of x. cout << ip << endl; // Prints A, the contents of ip. cout << &ip << endl; // Prints B, the address of ip. 相同,所以您应该在这里看到不同的值。

回顾一下:

A

在您的情况下,似乎x 0x28ff0c的地址为ip,地址B0x28ff08)为{{ 1}}。这并不意味着x的地址发生了变化,而是表明ipx占用了不同的内存地址。