所以我开始了一个编程项目,我发现如果我只能制作一个指针而不将其声明为char*
,int*
等等,那么它会让一切变得更容易,只需在某处指定大小其他。我四处搜寻但找不到任何有用的东西。
现在我的想法是将所有内容都设为char*
,并将它们与位移和/或操作联合起来(如果它不是字符串)。如果这对C来说太低了,我用什么语言来做这个,我宁愿不使用汇编,因为它不够平台。
修改 所以我忘记提到它应该在运行时分配内存,并且不要浪费太多内存我想根据大小分配内存。 例如,我想为char大小的值分配1个字节,为int大小的值分配2个字节,依此类推。大小是在文件中预定义的,但在读取文件之前是不知道的,应该在运行时读取而不是编译时间。
答案 0 :(得分:10)
C中有一个通用指针类型,原因如下:void *
。
您可以隐式地将任何数据指针类型转换为void *
:
char foo[] = "bar";
void *ptr = foo;
// ...
char *str = ptr;
但请注意,您仍需要知道正确的类型。通过错误类型的指针访问对象将是未定义的行为。
使用void *
无法做到两件事:
你不能在它上面做指针算术(这包括索引)。 void
是不完整类型,因此它没有已知的大小。一些编译器通过假设void *
的大小允许char
上的算术,但这是一个扩展,不可移植。
您无法取消引用void *
。 void
“没有”,所以没有意义。
答案 1 :(得分:1)
我认为对数据类型存在一些误解,以及编译时数据类型和运行时数据类型是什么。首先是C#的一个例子,它是一种编程语言,编译时数据类型和运行时数据类型之间的区别很重要。在C#中,您可以编写类似
的内容IEnumerable<int> myEnumerable = new List<int>();
此处,myEnumerable
对象具有编译时数据类型IEnumerable<int>
和运行时数据类型List<int>
。
但是,在C编程语言中,没有相关的概念,因为C没有这么强的类型系统。本质上,在C编程语言中,存储在变量中的所有信息都是二进制数据,存储在进程的虚拟内存中。此数据没有分配类型信息。因此,您无法通过查看数据来重建数据类型。在C编程语言中,您可以将数据转换为您喜欢的任何数据类型。
正如其他用户已经提到的,如果您不知道数据的具体类型,则可以使用void
。