指向指针的指针(C/C++)中的数据类型声明意义

Datatype declaration significance in pointer to pointer (C/C++)

本文关键字:指针 数据类型 声明 C++      更新时间:2023-10-16

指针到整数指针int**)和指向字符指针

任何指针的内存块大小都是一样的,所以子数据类型在这里不起作用吗?

这只是一个语义上的区别,没有其他意义吗?

为什么不只使用void**

当您想要指向char *的指针时,为什么要使用void**?为什么我们使用char **

有了char **,您就有了类型安全性。如果指针初始化正确且不为null,那么一旦获得有效的char *,就可以取消对它的引用,然后再取消对该指针的引用,就可以获得char

为什么要忽略类型安全中的这一优势,而用void**玩指针俄罗斯轮盘?

区别在于类型安全性。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>;
}

C标准规定,编译器可以利用arraylimit是指向不同类型的指针这一事实来得出它们不重叠的结论。给定这个规则,C实现可以在循环开始时评估*limit一次,因为它知道它在循环期间不会改变。如果没有这个规则,编译器将不得不假设对char**0的一个赋值可能会更改*limit,并且它将不得不在每次迭代中从内存加载*limit