我最近开始用C ++开发面向对象的软件,但在尝试理解指针时遇到了一些问题。我正在使用Qt Creator 3.3.0。
1。使用(* type)在变量中存储新地址
为什么总是需要这样做:
int* y = ( int*) 0x61fe9c;
要存储和寻址而不是:
int* y = 0x61fe9c;
指针不应该理解我正在存储内存位置的十六进制地址吗?
2。在指针中存储新的特定地址
我试图理解为什么将特定地址存储在指针中后,为什么必须以其他方式存储新地址:
int* y = ( int*) 0x61fe9c;
*y = 0x61fe9d;
如果我这样做,则地址存储没有任何问题,但是如果我想用其他方式存储它:
*y = (int*) 0x61fe9d;
编译器给我的错误是invalid conversion from 'int*' to 'int'
。
为什么不能更改如上所述存储的地址的值?
先谢谢您。
答案 0 :(得分:2)
为什么总是需要这样做:
int* y = ( int*) 0x61fe9c;
要存储和寻址而不是:
int* y = 0x61fe9c;
因为C ++具有强大的类型系统。
类型系统的设计旨在通过无意将一种类型的值分配给另一种类型的对象来防止程序员犯错误。这样的程序不是在运行时发生任意事情,而是格式错误的(例如,当一种类型可以隐式转换为另一种类型时,情况并非如此)。
在这种情况下,您尝试为指针分配一个整数。这种操作非常不寻常,您必须将整数类型的值显式转换为指针指针类型。
我试图理解为什么将特定地址存储在指针中后,为什么必须以其他方式存储新地址:
*y = 0x61fe9d;
这不会在指针中存储地址,即不会使指针指向另一个存储位置。您可以使用间接操作符(一元*
)通过指针进行间接操作,因此表达式的值是指向对象,而不是指针本身。
要更改指针的值,请不要通过它间接访问:
y = address_of_another_object;
*y = (int*) 0x61fe9d;
编译器给我错误
invalid conversion from 'int*' to
'int'。
就像上面的类型系统一样,除了在另一个方向上,它还可以阻止您将一种类型的值分配给另一种类型的对象。在这种情况下,您尝试将一个指针值分配给一个整数对象。
由于您的意图似乎不是要修改指向的对象,因此看来类型系统使您免于犯错。
P.S。除非您在那里创建了一个对象,否则通过指针间接访问内存的行为是不确定的。除非您已分配内存,否则您无法在任意内存位置创建对象。而且没有在任何位置分配内存的标准方法。
我所知道的唯一一种通过整数常量间接转换为指针的情况是某些嵌入式系统,其中记录的地址与硬件进行通信。在这种情况下,您可能需要将指向的类型限定为volatile
。
答案 1 :(得分:0)
如果执行此操作,则地址存储将没有任何问题
*y = 0x61fe9d;
仅将值6422173
(0x61fe9d的十进制表示形式)存储在y指向的地址中。
编译器给我从'int *'到的无效转换错误 'int'。
*y = (int*) 0x61fe9d;
给出错误,因为您试图将指针变量存储为int类型。
为什么不能更改如上所述存储的地址的值?
只需y = (int*) 0x61fe9d;
或者按照@ user463035818和@Quentin的评论,作为一种更好的做法,使用reinterpret_cast
来获得编译时的安全性。
y = reinterpret_cast<int*>(0x61fe9d);