可以将指针声明为 void 存储椅子吗?

Posted

技术标签:

【中文标题】可以将指针声明为 void 存储椅子吗?【英文标题】:Can a pointer be decleared as void storing chars? 【发布时间】:2021-09-14 11:17:12 【问题描述】:
char* pointer = new char [5];
strcpy_s(pointer,4, "foo");

我没有完全理解指针的工作原理。据我了解,变量指针应该存储新分配的字符串的起始地址。如果是这样,为什么指针是一个字符很重要,因为它只存储一个地址。

为什么我不能直接输入

void* pointer = new char [5]

谢谢。

【问题讨论】:

因为strcpy_s 期望char* 作为第一个参数 另外,使用void* 丢弃类型信息有什么好处? Void 是通配符,不适合在开始时使用。你失去了关于类型的信息。 原因1):为了类型安全(C/C++毕竟是一种类型安全的语言)。原因2):要知道单个元素的大小。 char 通常占用 1 个字节,而 double 通常占用 8 个字节。如果要将指针前移 1 个元素,则必须在第一种情况下添加 1 个字节,在第二种情况下添加 8 个。指针算法已经为您完成了这项工作,但需要类型。 “为什么我不能直接输入”你真的尝试过吗?问题不在于void* pointer = new char [5];,而是在那之后的任何事情,因为void* 没有太多可以做的事情 【参考方案1】:

指针需要知道其元素的大小,多亏了它,您可以使用[] operator 到达数组的某个元素,否则它怎么知道它必须移动多少内存才能到达 n-元素?如果您可以将指向任何类型的指针声明为 void,那么它必须自动推断出它指向的类型。考虑这段代码:

char* pointer = new char[5];
pointer[3] = 'a'; 

对于void*,这是不可能的。我想 strcpy_s 函数期望第一个参数为char*,而不是void*,这就是您的代码无法编译的原因。指针本身只是让您知道某些变量/数组甚至函数在内存中的位置,但是当您指定指针的类型时,它会提供更大的灵活性。

【讨论】:

当你写新的char [5]时指针是否已经不知道这个信息。 @Mephobia 当您将char* 转换为void* 时,您会丢弃此信息。 指针本身只是内存中开始的位置 @Mephobia • 指针是否已经不知道此信息...? 当指针为char* pointer = new char[5]; 时,它知道该信息。当指针为auto pointer = new char[5]; 时,则知道该信息。当指针为void* pointer = new char[5]; 时,信息已被有意丢弃。

以上是关于可以将指针声明为 void 存储椅子吗?的主要内容,如果未能解决你的问题,请参考以下文章

您可以在 C++ 中将指针声明为 extern 吗?

当一个函数无返回值时,函数的类型应定义为啥

第三节课作业

将 void 指针(数据)转换为函数指针

第三节课作业

第三节课作业