将地址转换为指针时出现问题
Problems casting an address to a pointer
我明白address-of运算符&
存储的是变量的实际地址。指针存储对地址的引用,我可以使用取消引用运算符 *
访问该地址。我不明白的是如何使指针指向给定地址。以下均无效。
void getDouble(double &addr) {
// Incorrect type cast error
std::cout << *((double *)addr) << std::endl;
// Incorrect type cast error
double *dbl = addr;
std::cout << (double *)addr << std::endl;
从 C/C++ 中的地址获取值的正确方法是什么?
I understand that the address-of operator & stores the actual address of the variable
运算符不“存储”任何东西。当您将一个值作为内置寻址运算符的操作数传递时,结果值是指向该对象的指针。如果操作数是引用,则结果是指向引用对象的指针。
A pointer stores a reference to an address
一个指针存储一个地址。指针的值代表地址。使用间接运算符,您可以通过指针间接获取指向指向对象的左值。
// Incorrect type cast error
double *dbl = addr;
addr
是对 double
的引用。对 double
的引用不会隐式转换为指针。
// Incorrect type cast error
std::cout << *((double *)addr) << std::endl;
对 double
的引用甚至不会显式转换为指针。
您可以使用 addressof 运算符获取指向所引用对象的指针,如果您想要这样做的话:
double *dbl = &addr; // pointer to object referred by addr
What is the correct way to get the value from an address in C++
如果您在示例中有诸如 addr
之类的引用,那么您只需像使用任何其他值一样使用该引用。引用将被隐式间接访问,并访问引用对象的值。例如,如果要打印对象的值:
std::cout << addr;
Okay so it's different in C++, whereas in C the & strictly means address-of
了解标记在不同上下文中具有不同含义很重要。示例:
int i = 1 & 2;
// ^--- bitwise-and operator (binary)
int* ptr = &i;
// ^ ^-- addressof operator (unary)
// ^---------- not an operator; signifies a pointer type
int i2 = *i * 42;
// ^ ^- multiplication operator (binary)
// ^---- indirection operator (unary)
int& ref = i;
// ^ not an operator; signifies a reference type
int i3 = ref; // automatic indirection
C++ 和 C 是不同的语言。 C 没有引用变量;该示例程序只是格式错误。最好不要根据对另一种语言的了解对一种语言做出假设。
I understand that the address-of operator &
stores the actual address of the variable.
它returns地址,它不会在任何地方存储地址。您需要对 store 该地址进行单独分配,例如在指针中。
A pointer stores a reference to an address
不,它存储的是实际地址。
that I can access using the dereference operator *
.
您取消引用指针以访问存储在指针指向的地址处的数据。
What I am not understanding is how to make a pointer point to a given address. Non of the following have worked.
那是因为您一开始并没有真正使用 &
的地址运算符。 double &addr
声明了一个名为 addr
的引用,该引用引用了某处的 double
。它不使用名为 addr
的 double
的地址。引用只是一个别名,它不是指针(尽管大多数编译器会实现使用指针的引用)。
您需要使用 &
运算符(或 std::addressof()
)的实际地址,即使您正在处理对变量的引用。获取引用的地址 returns 所引用事物的地址。
void getDouble(double &dbl) {
// prints the value of the double
std::cout << dbl << std::endl;
// prints the address of the double
std::cout << &dbl << std::endl;
// prints the value of the double
std::cout << *(&dbl) << std::endl;
// prints the address of the double
double *addr = &dbl;
std::cout << addr << std::endl;
// prints the value of the double
std::cout << *addr << std::endl;
}
我明白address-of运算符&
存储的是变量的实际地址。指针存储对地址的引用,我可以使用取消引用运算符 *
访问该地址。我不明白的是如何使指针指向给定地址。以下均无效。
void getDouble(double &addr) {
// Incorrect type cast error
std::cout << *((double *)addr) << std::endl;
// Incorrect type cast error
double *dbl = addr;
std::cout << (double *)addr << std::endl;
从 C/C++ 中的地址获取值的正确方法是什么?
I understand that the address-of operator & stores the actual address of the variable
运算符不“存储”任何东西。当您将一个值作为内置寻址运算符的操作数传递时,结果值是指向该对象的指针。如果操作数是引用,则结果是指向引用对象的指针。
A pointer stores a reference to an address
一个指针存储一个地址。指针的值代表地址。使用间接运算符,您可以通过指针间接获取指向指向对象的左值。
// Incorrect type cast error double *dbl = addr;
addr
是对 double
的引用。对 double
的引用不会隐式转换为指针。
// Incorrect type cast error std::cout << *((double *)addr) << std::endl;
对 double
的引用甚至不会显式转换为指针。
您可以使用 addressof 运算符获取指向所引用对象的指针,如果您想要这样做的话:
double *dbl = &addr; // pointer to object referred by addr
What is the correct way to get the value from an address in C++
如果您在示例中有诸如 addr
之类的引用,那么您只需像使用任何其他值一样使用该引用。引用将被隐式间接访问,并访问引用对象的值。例如,如果要打印对象的值:
std::cout << addr;
Okay so it's different in C++, whereas in C the & strictly means address-of
了解标记在不同上下文中具有不同含义很重要。示例:
int i = 1 & 2;
// ^--- bitwise-and operator (binary)
int* ptr = &i;
// ^ ^-- addressof operator (unary)
// ^---------- not an operator; signifies a pointer type
int i2 = *i * 42;
// ^ ^- multiplication operator (binary)
// ^---- indirection operator (unary)
int& ref = i;
// ^ not an operator; signifies a reference type
int i3 = ref; // automatic indirection
C++ 和 C 是不同的语言。 C 没有引用变量;该示例程序只是格式错误。最好不要根据对另一种语言的了解对一种语言做出假设。
I understand that the address-of operator
&
stores the actual address of the variable.
它returns地址,它不会在任何地方存储地址。您需要对 store 该地址进行单独分配,例如在指针中。
A pointer stores a reference to an address
不,它存储的是实际地址。
that I can access using the dereference operator
*
.
您取消引用指针以访问存储在指针指向的地址处的数据。
What I am not understanding is how to make a pointer point to a given address. Non of the following have worked.
那是因为您一开始并没有真正使用 &
的地址运算符。 double &addr
声明了一个名为 addr
的引用,该引用引用了某处的 double
。它不使用名为 addr
的 double
的地址。引用只是一个别名,它不是指针(尽管大多数编译器会实现使用指针的引用)。
您需要使用 &
运算符(或 std::addressof()
)的实际地址,即使您正在处理对变量的引用。获取引用的地址 returns 所引用事物的地址。
void getDouble(double &dbl) {
// prints the value of the double
std::cout << dbl << std::endl;
// prints the address of the double
std::cout << &dbl << std::endl;
// prints the value of the double
std::cout << *(&dbl) << std::endl;
// prints the address of the double
double *addr = &dbl;
std::cout << addr << std::endl;
// prints the value of the double
std::cout << *addr << std::endl;
}