C++ 中的指针地址
Pointer address in c++
我提前为这个问题的愚蠢道歉。但我找不到理解这个结果的方法。我试图弄清楚指针在C++中到底是什么。以下只是以不同方式打印地址的简单代码。
int a = 15000;
char *b = reinterpret_cast<char*>(a); //equivalent of char *b = (char *)a
int *m = &a;
//(1)
printf("&a:%pn",&a); //0x7fff5fbff878
printf("&*m:%pn",&*m); //0x7fff5fbff878
printf("m:%pn",m); //0x7fff5fbff878
//(2)
printf("a:%pn",(int*)a); //0x3a98
printf("&*b:%pn",&*b); //0x3a98
printf("b:%pn",b); //0x3a98
printf("*m:%pn",(int*)*m); //0x3a98
printf("&b:%pn",&b); //0x7fff5fbff870
printf("&m:%pn",&m); //0x7fff5fbff868
//(3)
std::cout << "b:" << b << std::endl; //error: Segmentation fault: 11
所以问题是
- 为什么(1)和(2)的地址不同
- 为什么 (1) 和 (2) 的大小(地址长度)不同 将
- int 转换为字符时发生了什么* "
- b"如何包含"a"的地址
- 为什么错误 (3) 在"printf("b:%p",b)"工作时发生。
为什么(1)和(2)的地址不同
因为在第一个示例 (1) 中,您使用了运算符的&
地址,它为您提供了存储"a"变量的地址,示例 0x50302040
。
但是第二个示例 (2),您使用的是地址 ( 0x50302040
) 指向的值,该值返回 15000,等于十六进制的 0x3a98。
将int 转换为字符时发生了什么*
如果int
的值为 15000,现在char*
指向地址15000
,这显然是错误的。
为什么错误 (3) 在"printf("b:%p",b)"工作时发生。
由于指针是char*
指针,因此使用字符序列重载(ostream& operator<< (ostream& os, const char* s);
,并且由于指针不指向字符序列(实际上,由于您为其分配了无效值,因此它不指向任何内容),因此程序崩溃。
有一个ostream& operator<< (void* val);
重载只会打印指针的地址,但您需要将char*
指针显式转换为void*
指针才能使用它:
std::cout << "b:" << (void*)b << std::endl; // Prints 0x3a98 (15000)
相关文章:
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- 在C++中打印指向不同基元数据类型的指针的内存地址
- 将地址分配给本地指针后,公共对象的变量将消失
- 为什么指针不写入类的地址?
- CUDA:统一内存和指针地址的更改
- 为什么 vector 的随机访问迭代器给出与指针不同的内存地址?
- 如何从绝对地址的 C 样式指针创建对C++对象的引用
- 当我在 C++ 中将派生类的指针分配给指针时,地址会更改
- 是否可以仅通过将分配的指针地址存储在C++中来分析内存?
- 如何在程序集函数中将元素数组作为参数传递时转发 ARM 寄存器的地址指针
- 如何使用构造函数初始化内存地址(指针变量)?
- 数组基础地址指针
- 如何在不使用返回的情况下从函数获取变量的地址(指针)
- 保存QWidgets的地址/指针
- C++ 读取内存地址/指针和偏移量
- 从存储在 CTreeCtrl 的 LPARAM 中的结构中检索地址/指针 (IXMLDOMNode*) - 不起作用
- 简单的C++地址/指针澄清
- 如何获取成员函数的地址指针
- 当“按引用传递”成为强制传递而不是按地址/指针传递时
- C++ 为什么不是同一个地址(指针)