C++ 为什么指针需要不同的数据类型? 指针基本上是一个用于存储内存地址的变量,它总是 十六进制(内存地址) 那么为什么我们需要不同的数据类型来存储地址呢 例如:int*a;我们可以用这个来存储浮点地址吗
并非所有指针都(要求)具有相同的大小。如果您有一个需要对齐到10MB的大型结构,编译器可以决定只需要8位(而不是通常的32或64位)来存储变量可能位于的所有可能地址 您也不需要不同的数据类型,您可以使用C++ 为什么指针需要不同的数据类型? 指针基本上是一个用于存储内存地址的变量,它总是 十六进制(内存地址) 那么为什么我们需要不同的数据类型来存储地址呢 例如:int*a;我们可以用这个来存储浮点地址吗,c++,c,operating-system,C++,C,Operating System,并非所有指针都(要求)具有相同的大小。如果您有一个需要对齐到10MB的大型结构,编译器可以决定只需要8位(而不是通常的32或64位)来存储变量可能位于的所有可能地址 您也不需要不同的数据类型,您可以使用void*很好,但为什么要这样做呢?在C++中,这是代码的气味。 还有类型安全。您知道int*指向int,这对您有利。因为它提供了有关如何解释指针所指数据的信息 例如:int*a;我们可以用这个来存储浮点地址吗 通过C类型的不安全特性:是的,但不是直接的,特别是在最近的编译器和标准中(它们往往越来
void*
很好,但为什么要这样做呢?在C++中,这是代码的气味。
还有类型安全。您知道
int*
指向int
,这对您有利。因为它提供了有关如何解释指针所指数据的信息
例如:int*a;我们可以用这个来存储浮点地址吗
通过C类型的不安全特性:是的,但不是直接的,特别是在最近的编译器和标准中(它们往往越来越安全)两个原因:
char
的指针必须能够寻址单个字节,但指向int
的指针只需要能够寻址4个字节的组。因此后者可以使用包含字节地址除以4的格式字符
指针并将其分配给int
,则它需要知道它应该只从源中读取一个字节,并将其扩展到int
的大小。如果没有指针类型声明,它将读取超出适当范围的字节首先,我不知道有哪台机器有指针 存储为十六进制;我熟悉的每台机器都用过 内部的二进制表示。(过去30或40年 年,至少。IIRC,IBM 1401到处都使用十进制。) 正如其他人所指出的,并非所有指针都具有相同的特性 大小和代表性。我在
char*
比其他数据指针类型更大,当然
不同大小的函数指针和数据指针用于
这很常见
然而,真正的答案是基于C和C中的类型系统
C++。如果p
是指针,那么*p
的类型是什么?如果我写
类似于*p+*q
,编译器必须知道是否使用
例如,整数算术或浮点算术
至于你的第二个问题:通常是的,尽管你会
可能需要在那里的某个地方重新解释一下。然而,
你唯一可以合法使用int*
的就是强制转换它
返回到一个浮动*
;取消引用它是未定义的行为
char*
和unsigned char*
有一些例外。及
在实践中,如果你知道你在做什么,你可以逃脱
例如:
float f;
int* a = reinterpret_cast<int*>( &f );
std::cout << *a << std::endl;
float f;
int*a=重新解释铸件(&f);
标准::cout
为什么我们需要不同的数据类型来存储地址
这实际上是一个正确的问题,答案隐藏在其中——为什么我们需要不同的数据类型来存储地址。我们(程序员)需要它。机器不在乎——一个数字和另一个一样
如果您认为“变量”是某些数据的“占位符”,那么在编程语言中,使用数据本身和使用变量之间存在着二分法。有时您只需要数据(例如,您需要打印出来),有时您需要存储此数据的地址(例如,以便您可以修改它)。大多数语言都有将这两种情况混淆的语法糖,并在不同的上下文中对变量标识符进行不同的处理
一个这样的例子是这样的:考虑语句
a = 1;
在本例中,编译器查找由“a”标识的变量的地址,并将“1”写入该地址。标识符“a”也可以是指针。现在看看另一件事:
if (a == 1) ... ;
您不是在将“a”标识的变量的地址与某物进行比较,而是在将存储在此地址的内容与“1”进行比较
各种各样的“指针类型”再次出现是为了方便程序员:基本上是这样,我们通过错误地访问数据来减少错误。看看这个例子:
double d;
double* dp;
int i;
int* ip;
默认情况下,C对此非常放松,您通常可以执行以下操作:
dp = ip;
或
。。。但是sizeof(i)==4和sizeof(d)==8,因此,如果您取消引用dp指针,您将尝试从仅包含4的变量(i)中读取8个字节。这意味着您将在i的前四个字节之后读取4个不可预测(随机)字节,这绝对是您不想做的事情
同样,所有这些都是为了我们的方便。机器不在乎。这两个指针在CPU上的外观和行为都完全相同。“内存地址,始终是十六进制”否。这取决于表示形式,它位于另一层。在web上搜索时,我得到了很好的结果,表示形式从来都不可见……指针算法也有优势吗?
dp = &i;