我是编程新手。我有一个问题,我自己找不到可以理解的答案。我想通过使用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);
}
答案 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;
}
出于历史目的, static_cast<void*>(p)
正在将char *转换为void *。 char*
是一个指针,但它在C中用作string
。因此<< operator
将把它作为一个值处理,而不是指针。所以这里的技巧是转换为另一种指针类型,以便<< operator
将打印其实际值,即g
的地址。
现在,&p
是p
的地址,而不是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 - &p
是p
的地址,而不是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);
}