是否可以在没有特定数据类型的情况下在 C 中创建指针

Is it possible to create pointers in C without a specific datatype

所以我开始了一个编程项目,我发现如果我可以创建一个指针而不将其声明为 char*int* 等等并指定其他地方的尺寸。我四处搜索但找不到任何有用的东西。

现在我的想法是将所有内容都设为 char*,如果不是字符串,则将它们与移位和/或操作结合起来。如果这对C来说太低了,什么语言让我这样做,我宁愿不使用汇编,因为它不够跨平台。

编辑: 所以我忘记提到它应该在运行时分配内存,并且为了不浪费太多内存我想根据大小分配内存。 例如,我想为 char 大小的值分配 1 个字节,为 int 大小的值分配 2 个字节,依此类推。大小是在文件中预定义的,但在读取文件之前是未知的,应该在运行时而不是编译时读取。

C 中有一个通用指针类型正是因为这个原因:void *

您可以将任何数据指针类型隐式转换为 void *:

char foo[] = "bar";
void *ptr = foo;

// ...

char *str = ptr;

但请注意,您仍然需要知道正确的类型。通过错误类型的指针访问对象将是 未定义的行为


void *有两件事不能做:

  • 您不能对其进行指针运算(包括索引)。 void 是一个 不完整的类型 ,因此它的大小未知。一些编译器通过假设 char 的大小允许对 void * 进行算术运算,但这是一个扩展并且 不可移植

  • 您不能取消引用 void *void是"nothing",所以没有意义。

我认为对数据类型存在一些误解,什么是编译时数据类型和 运行-时数据类型。首先是 C# 的示例,这是一种编程语言,其中编译时数据类型和 运行 时数据类型之间的区别很重要。在 C# 中,您可以编写类似

的内容
IEnumerable<int> myEnumerable = new List<int>();

此处,myEnumerable 对象具有编译时数据类型 IEnumerable<int> 和 运行 时间数据类型 List<int>.

但是在C编程语言中,并没有相关的概念,因为C没有这么强的类型系统。本质上,在 C 编程语言中,您存储在变量中的所有信息都是存储在进程虚拟内存中某处的二进制数据。该数据没有分配给它的类型信息。因此,您无法通过简单地查看数据来重建数据的类型。在 C 编程语言中,您可以将数据转换为您喜欢的任何数据类型。

正如其他用户已经提到的,如果您不知道数据的具体类型,可以使用 void