指针的地址

时间:2016-03-08 09:52:24

标签: c++

我是编程新手。我有一个问题,我自己找不到可以理解的答案。我想通过使用C ++和C找到指针的地址,但是两个结果是不同的,尽管它们有一些相似的数字。他们还是同一个地址吗?

adress of g is :0018F9C4
address of g is: 0018F9D3

这是我的代码:

#include<iostream>
#include<stdio.h>
void main()
{
    char g = 'z';
    char*p;

    p = &g;

    std::cout << "adress of g is :" << &p;
    printf("\naddress of g is: %p", p);
}

5 个答案:

答案 0 :(得分:7)

此行显示地址 <{em> p

std::cout << "address of p is :" << &p;

此行显示地址 p,即地址 g

printf("\naddress of g is: %p", p);

结果不同是正常的。

尝试

std::cout << "address of g is :" << static_cast<void*>(p);
printf("\naddress of g is: %p", p);

答案 1 :(得分:1)

在std :: cout的行上打印出&amp; p ... p本身的地址 在printf行上打印出p..no&amp; p

的值

当然不同。

你应该使用

std::cout << "adress of g is :" << (void *)p;
printf("\naddress of g is: %p", p);

为什么要混用cout和printf?

答案 2 :(得分:1)

此示例可能会以更好的方式显示它:

#include<iostream>
#include<stdio.h>
int main()
{
    char g = 'z';
    char*p = &g;
    std::cout << "adress of g is :" << static_cast<void*>(p);
    std::cout << "\nadress of p is :" << &p;
    return 0;
}

Demo

出于历史目的,

static_cast<void*>(p)正在将char *转换为void *。 char*是一个指针,但它在C中用作string。因此<< operator将把它作为一个值处理,而不是指针。所以这里的技巧是转换为另一种指针类型,以便<< operator将打印其实际值,即g的地址。

现在,&pp的地址,而不是g的地址。换句话说,它是g地址存储在的地方的地址。

(g=='z') is True
(&g==p) is True
(*p==g) is True

(&p==p) is False
(&g=&p) is False

答案 3 :(得分:1)

您需要记住 指针的地址 指针指向的地址 为2不同的东西。

&p --> Address of "P" p --> Address of "g" what pointer is pointing to

答案 4 :(得分:0)

答案:不,它们不是同一个地址,这很清楚,因为值不同 - 指向同一位置的程序的内存地址总是< / em>是一样的。

说明:
(tl; dr - &pp的地址,而不是g的地址)

char g = 'z'完全符合您的期望 - 创建一个文字常量,并确保它在程序执行期间位于内存中的某个位置。 char*p; p = &g;(可以缩短为char*p = &g)再一次,不是您所期望的,将数据g的内存地址提供给名为{{1}的变量}但请注意,p 也是一个变量,因此必须保存在内存中!

程序中的错误是在最后两行执行期间:

p

第一行(使用std :: cout)将显示 std::cout << "adress of g is :" << &p; printf("\naddress of g is: %p", p); 的地址,如前所述,p是一个指针,但指针没有什么不同来自任何其他变量 - 它只是存储在内存中的数据。因此,此时您正在创建临时 指向指针的指针 - AKA p

然而,第二行符合您的预期,输出存储在char **中的内存地址。 正确的计划如下。

p

您也可以尝试在此示例中使用调试器!

#include<iostream>
#include<stdio.h>
void main()
{
    char g = 'z';
    char*p = &g;


    std::cout << "adress of g is :" << (int)p; //optionally for C++11 use static_cast<int>
    printf("\naddress of g is: %p", p);
}