Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么指针需要不同的数据类型? 指针基本上是一个用于存储内存地址的变量,它总是 十六进制(内存地址) 那么为什么我们需要不同的数据类型来存储地址呢 例如:int*a;我们可以用这个来存储浮点地址吗_C++_C_Operating System - Fatal编程技术网

C++ 为什么指针需要不同的数据类型? 指针基本上是一个用于存储内存地址的变量,它总是 十六进制(内存地址) 那么为什么我们需要不同的数据类型来存储地址呢 例如:int*a;我们可以用这个来存储浮点地址吗

C++ 为什么指针需要不同的数据类型? 指针基本上是一个用于存储内存地址的变量,它总是 十六进制(内存地址) 那么为什么我们需要不同的数据类型来存储地址呢 例如:int*a;我们可以用这个来存储浮点地址吗,c++,c,operating-system,C++,C,Operating System,并非所有指针都(要求)具有相同的大小。如果您有一个需要对齐到10MB的大型结构,编译器可以决定只需要8位(而不是通常的32或64位)来存储变量可能位于的所有可能地址 您也不需要不同的数据类型,您可以使用void*很好,但为什么要这样做呢?在C++中,这是代码的气味。 还有类型安全。您知道int*指向int,这对您有利。因为它提供了有关如何解释指针所指数据的信息 例如:int*a;我们可以用这个来存储浮点地址吗 通过C类型的不安全特性:是的,但不是直接的,特别是在最近的编译器和标准中(它们往往越来

并非所有指针都(要求)具有相同的大小。如果您有一个需要对齐到10MB的大型结构,编译器可以决定只需要8位(而不是通常的32或64位)来存储变量可能位于的所有可能地址

您也不需要不同的数据类型,您可以使用
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;