不同之处在于型式安全.T**隐式地将数据解释为T. void**但是,需要首先手动输入.不,指针分别不是32/64位架构上的全部4/8字节.例如,成员函数指针也包含偏移量信息,需要将其存储在指针本身中(在最常见的实现中).
大多数C实现对所有指针使用相同的大小和格式,但C标准不要求这样做.
有些机器没有字节寻址,因此C实现通过使用移位和其他操作来实现它.在这些实现中,指向较大类型的指针(例如int,可以是普通地址),但是指针char必须具有机器地址和字节内偏移量.
此外,C还将类型信息用于各种目的,包括减少程序员所犯的错误(当您尝试使用指向需要指针的int位置时可能会发出警告或错误float)和优化.关于优化,请考虑以下示例:
void foo(float *array, int *limit)
{
for (int i = 0; i < *limit; ++i)
array[i] = <some calculation>;
}
Run Code Online (Sandbox Code Playgroud)
C标准表示编译器可以使用这样的事实,array并limit指向不同类型的指针,以得出它们不重叠的结论.根据这个规则,C实现可以*limit在循环开始时评估一次,因为它知道它在循环期间不会改变.如果没有这个规则,编译器就必须假设其中一个赋值array[i]可能会改变*limit,并且必须*limit在每次迭代中从内存加载.
当你想要一个指针时,我们为什么要使用?为什么我们不能用?void**char *char **
有了char **,你有类型安全.如果指针被正确初始化并且不是null,那么一旦获得有效指针就知道通过解引用它char *- 并且通过取消引用该指针,反过来,你得到一个char.
你为什么要忽略这种类型安全的优势,而是用指针俄罗斯轮盘赌void**?