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而不解决这些问题.
谢谢你的时间.
问题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.
| 归档时间: |
|
| 查看次数: |
162 次 |
| 最近记录: |