如何将一个指针指向的地址存储到另一个指针?

Posted

技术标签:

【中文标题】如何将一个指针指向的地址存储到另一个指针?【英文标题】:How to store the address that a pointer points to to another pointer? 【发布时间】:2021-02-10 12:14:39 【问题描述】:

此代码旨在使指针 c 指向指针 a 指向的地址。 我无法理解这个表达式:“ char* c= (char*)&a ”。 有人可以澄清一下吗?

string* a =new string;
std::cin >> *a;
char* c= (char*)&a;
delete a;

【问题讨论】:

这个表达没什么意义。你的意思是const char* c = a->c_str(); a被删除后,您不能使用c中存储的地址 char* c= (char*)&a; 看起来是个大错误。使用 C-cast,您可以将几乎所有内容“出售”给编译器(使其保持沉默),但最终您仍然可以获得 U.B. (迟早)。 (而且,如果没有编译器投诉,找到它会变得更加困难。) 不同的问题,类似的误解:***.com/q/66027913/4117728 指针指向的地址是它的值,而不是它的地址。要获取指针a 指向的地址,您可以简单地读取a,而不是&a。要将指针a 指向的地址存储在c 中,您可以使用char *c = (char *)a;,但这没有多大意义。请描述您的期望或您希望通过代码实现的目标。 【参考方案1】:

一个指针指向的地址如何存储到另一个指针?

你可以复制它:

T* a = some_address;
T* b = a; // copied the address from a to b

这个表达我看不懂:char* c= (char*)&a

这声明了一个char* 类型的变量,它是一个指向char 的指针。变量的名称是c。该变量使用表达式(char*)&a 进行初始化。

一元& 是地址运算符。当应用于左值时,它会产生由左值命名的对象的地址。在这种情况下,您将获得变量a 的地址。注意变量a的地址与a指向的动态对象的地址不同。因为a的类型是string*,所以指向a的指针的类型是string**

(char*)a 是一种显式转换(又名 C 样式转换)。在这种情况下,它执行从string**char* 的重新解释转换。如果没有上下文,这种转换似乎没有意义,但无论如何它都会使示例格式正确。不要在 C++ 中使用 C 风格的强制转换。

附:避免不必要的动态分配。如果stringstd::string,那么几乎没有理由动态分配它。


我试图让 c 指向字符串 *a 中第一个字母的内存地址。我该怎么做?

a 中根本没有字母。 a 仅包含 string 对象的地址。

如果您想指向存储在由a 指向的字符串管理的缓冲区中的第一个字符 - 假设stringstd::string,那么您可以通过a 间接并使用std::stringdata成员函数:

char* c = a->data();

【讨论】:

格式正确,因为它是指向char 的指针,而int* 的情况会有所不同,不是吗?也许澄清一下 @largest_prime_is_463035818 演员阵容仍然很好。在这种情况下,尝试通过重新解释的指针访问内存将是 UB。 哦,对了。我不知道 OP 的意图是什么,但如果他们想获得指向 c 字符串的指针,他们就走错了路。您已经解释过了,我只是不确定“格式良好”是否会引起误解。没关系,你已经有我的投票了 我试图让 c 指向字符串 *a 中第一个字母的内存地址。我该怎么做?

以上是关于如何将一个指针指向的地址存储到另一个指针?的主要内容,如果未能解决你的问题,请参考以下文章

c语言如何将两个变量关联起来

OC(C语言特性函数,指针)

C ---指针(初级)

将两个指针的值相加并将相加保存到另一个指针中

C语言学习笔记指针

将数据存储在 blob 中与存储指向文件的指针有啥区别?