指向指针的指针(C/C++)中的数据类型声明意义
Datatype declaration significance in pointer to pointer (C/C++)
指针到整数指针( 任何指针的内存块大小都是一样的,所以子数据类型在这里不起作用吗? 这只是一个语义上的区别,没有其他意义吗? 为什么不只使用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标准规定,编译器可以利用array
和limit
是指向不同类型的指针这一事实来得出它们不重叠的结论。给定这个规则,C实现可以在循环开始时评估*limit
一次,因为它知道它在循环期间不会改变。如果没有这个规则,编译器将不得不假设对char**
0的一个赋值可能会更改*limit
,并且它将不得不在每次迭代中从内存加载*limit
。
- 在C++中打印指向不同基元数据类型的指针的内存地址
- int数据类型的指针指向的是什么,如果是一个类的私有数据成员,我们创建了该类的两个对象?
- 尝试了解C++指针和数据类型初始化
- 指针数据类型变量如何包含对象?
- 指向数据类型的指针的类模板推导
- 如何在C 中使用不同数据类型的类模板指针声明指针
- 具有不同数据类型或参数的不同函数的函数指针
- 以其数据类型作为参数以指针
- 将原始数据类型转换为空隙指针类型
- C++指针给出数据类型为"int"的错误,但与"char"一起工作正常
- 如何正确地对数据开始指针进行类型转换(这是一种很好的做法吗)
- 具有指针数据类型的非类型函数模板参数
- C++指向函数作为参数的指针.数据类型不兼容
- 指向指针的指针(C/C++)中的数据类型声明意义
- 将数组变量分配给 C++ 中相同数据类型的指针
- 为什么我们需要不同的数据类型来表示指针
- 为什么指针声明中需要数据类型
- 数据类型指针使用*(Datatype *)
- C /c++数据类型,通过指针实现最快的可移植访问
- 如何访问结构中的int指针数据类型并为其赋值