我对指针/引用中C++中"&"运算符的不一致应用感到困惑?

yet*_*oob -4 c++ pointers reference

我已经检查了很多编程语言(Java,Erlang,python等)但我发现C/C++很难学习.仅仅因为我认为它有时候不合理;

EX1:

    #include <iostream>

    int main() {

     int ar1 = {1,2,3};
     int *p1 = ar1;

     char *msg = "message";

     std::cout << "addr: " << p1 << std::endl ;//prints the array address

     std::cout << "value: " << *p1 << std::endl ;//prints the first element


     std::cout << "addr: " << msg << std::endl ;//prints "message" , wtf why not    the addr?how can i get its address?

     std::cout << "value: " << *msg << std::endl ;//prints the first character


    }
Run Code Online (Sandbox Code Playgroud)

EX2:

    #include <iostream>

    int main() {

     int n1 = 5;
     int *p1 = &n1;

     int &r1 = *p1; // why not: int &r1 = p1; ,*p1 is NOT an address,p1 is.This does not make any sense...



     }
Run Code Online (Sandbox Code Playgroud)

你能解释一下这些例子吗?我不能继续研究Cplusplus而不解决这些问题.

谢谢你的时间.

Mik*_*our 6

问题1:

char *msg = "message";
std::cout << "addr: " << msg << std::endl ;
//prints "message" , wtf why not    the addr?
Run Code Online (Sandbox Code Playgroud)

这是C语言历史演变的人工制品,其中字符串通常由字符数组或指向此类数组的指针表示.为了支持这一点,<<有一个重载char const *,它将它视为指向字符串的指针并打印字符串内容.

您可以通过使用std::string类来表示字符串来避免混淆,并避免使用C风格的字符串,除非在非常罕见的情况下它们是有用的.

how can i get its address?
Run Code Online (Sandbox Code Playgroud)

您可以将其转换为通用指针:

std::cout << "addr: " << static_cast<void*>(msg) << std::endl;
                         ^^^^^^^^^^^^^^^^^^
Run Code Online (Sandbox Code Playgroud)

问题2:

int n1 = 5;
int p1 = &n1;
Run Code Online (Sandbox Code Playgroud)

那不编译,因为&n1是一个地址,因此只能用于初始化指针,而不是int.我猜你的意思是:

int *p1 = &n1;

int &r1 = *p1; 
// why not: int &r1 = p1; ,*p1 is NOT an address,p1 is.This does not make any sense...
Run Code Online (Sandbox Code Playgroud)

因为引用不是指针,并且没有使用地址初始化.必须使用(有效)对象初始化引用,并成为该对象的别名.*p1是一个类型的对象int,因此可以用来初始化引用int.