答案: 不,它们不是相同的地址,这很明显因为它们的值是不同的 - 指向同一位置的程序内存地址将始终相同。
解释:
(tl;dr - &p
是 p
的地址,而不是 g
的地址)
char g = 'z'
做了你所期望的事情 - 创建一个文字常量,并确保它在程序执行期间的某个地方存在于内存中。
char*p; p = &g;
(可以缩短为char*p = &g
)再次做了你所期望的事情,将数据g
的内存地址提供给名为p
的变量 ~ 请注意,p
也是一个变量,因此必须保存在内存中!
您的程序中的错误发生在执行的最后两行:
std::cout << "adress of g is :" << &p;
printf("\naddress of g is: %p", p);
第一行(使用std :: cout)将呈现p
的地址,如先前所述,p
是指针,但指针与任何其他变量没有区别-它只是存储在内存中的数据。因此,在这一点上,您正在创建一个指向指针的临时 -也称为char **
。
然而,第二行执行您期望的操作,输出存储在p
中的内存地址。
正确的程序应该如下所示。
#include<iostream>
#include<stdio.h>
void main()
{
char g = 'z';
char*p = &g;
std::cout << "adress of g is :" << (int)p;
printf("\naddress of g is: %p", p);
}
你也可以尝试在这个示例上使用调试器!
#include<iostream>
#include<stdio.h>
#include<cstdint>
void main()
{
char g = 'z';
char*p = &g;
uint32_t P_value = (uint32_t)p;
std::cout << "adress of g is :" << P_value;
printf("\naddress of g is: %p", p);
}
&g
时,你会得到一个指向g
的指针。当你执行&p
时会发生什么?(提示:你不会得到一个指向g
的指针) - Some programmer dudevoid main()
是错误的。请使用int main()
。 - Simple