直接上关键代码(完整代码见下方):
[C++] 纯文本查看 复制代码 std::cout << name << " at " << reinterpret_cast<int *>(name) << std::endl; //clangd纠错后的
std::cout << name << " at " << (&name) << std::endl;//自己写的
疑问:
1.为什么直接强制类型转换后的name的地址和我使用&取址得出来的值不是一个?
2.为什么一定要转换为 int * 类型?
是不是我个人的理解有误?
我个人认为第一句的(int*)是强制转换类型(就是显示字符串数组原本的地址),而第二句我自己写的就是想强制取址看看地址,结果不对……
reinterpret_cast<int *>(name)这个能理解,必应的结果是显式强制类型转换
[C++] 纯文本查看 复制代码 #include <cstring>
#include <iostream>
char *get_name(void);
int main(void)
{
char *name = NULL;
name = get_name();//相当于数组名,本质指针。
std::cout << name << " at " << (int *) name << std::endl; //原代码
std::cout << name << " at " << reinterpret_cast<int *>(name) << std::endl; //clangd自动纠错后的代码(疑问,为什么一定要转换为int*类型?)
std::cout << name << " at " << (&name) << std::endl; //我写的代码,原意是想直接打印指针值的。
delete[] name;
return 0;
}
char *get_name(void)
{
char temp[80] = {0};
std::cin >> temp;//字符串数组已完毕
char *pn = new char[std::strlen(temp) + 1];//pn就相当于新的字符串数组名,同时也是指向字符串的指针
std::strcpy(pn, temp);//将数据存入新的指针中(非原指针)
return pn;//返回的是个指针(相当于数组名)
} |