可以将指针声明为 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 存储椅子吗?的主要内容,如果未能解决你的问题,请参考以下文章