【问题标题】:I wonder what really the &a returns?我想知道 &a 到底返回了什么?
【发布时间】:2011-09-09 11:30:03
【问题描述】:

假设

第一种情况

 int a;
 int *p= &a ; it works no error

第二种情况

 long int a;
 long int b;
 b = & a; it wont work 

我们大多数人都说 b 是变量而不是指针。但请看下文。

所以问题是如果&a 返回的地址是一个无符号整数,那么为什么我们不能将它分配给一个普通变量呢?但为什么只指向指针? 见下文

b = (unsigned int) &a ; it works after typecasting though its not practicable.

如果地址是整数格式,那么为什么不保存无符号或长整数呢?我在想,这背后一定有什么不为人知的秘密。有人能透露吗?我的想法是,指针必须在内部做某事,但我想知道它会是什么以及为什么不能是普通变量。

感谢您的所有回答,但实际问题是 &a 真正返回的是什么?整数值与否?如果它是整数,为什么变量不能容纳它? long int a =65535 \valid 为什么不是 int a= &b 如果地址 b 的值为 65535

我不担心将它用作指针,请问题只是保存值。不尊重地址。人们说 32 或 64 位,我不担心。地址是整数为什么不能保存地址?

我的意思是为什么我们不能分配值,我不是说将指针的属性分配给变量,而只是分配它的值

a=65535
b = a \\ works it assigns b - 65535
&a=65535
b = & a   \\ doesn't work, if address is a some integer value,why we can't store it in a variable?

以 16 位为例,普通指针(地址)大小为 2 个字节,变量大小为 2 个字节,如果地址是整数值,为什么我们不能将地址存储在其他变量中,这就是我的问题,我找到了很多类似 ++ 的答案指针加 4,变量加 1,不用担心只分配值是更重要的问题。

  b = & a ; address of a is 4000
  ++b ; becomes 4001 thats it,thats not a problem 

【问题讨论】:

  • 什么是“正常变量”? “指针必须在里面做某事”正确。你还需要知道什么?它们不是 整数。他们是指针。请更新您的问题以解释“正常变量”的含义。
  • 虽然它是一个整数,但类型不匹配,因此您无法分配它们。这就像说UnrelatedClassAUnrelatedClassB 只是字节,那么为什么不能将一个分配给另一个呢?它是类型系统的一部分。

标签: programming-languages c++ c pointers reference


【解决方案1】:

整数,甚至long int,并不总是与指针大小相同。有时它们会是(例如,大多数 32 位体系结构具有 sizeof(int) == sizeof(void *)),有时它们会有所不同(例如,一些 64 位体系结构具有 sizeof(long) == sizeof(void *) 但有些则没有——Windows 上的 Visual C++ 是主要的sizeof(long) != sizeof(void *)) 的编译器示例。

还有一个事实是void *long int 根本不是同一类型

想象一个类 Foo 和一个类 Bar,定义如下:

class Foo {
   public: int a;
};

class Bar {
   public: int b;
};

这就像问为什么不能将类 Foo 的实例分配给 Bar 类型的变量——它们不是一回事,尽管在这种情况下 FooBar具有相同的底层位模式。

【讨论】:

    【解决方案2】:

    返回无符号整数地址

    不,不是。 指针(地址)是一个指针。期间。

    【讨论】:

    • 虽然你说的是真的,但这对指针新手来说并没有什么帮助,我认为OP是。
    • MGZero - 我感谢他思考这个问题,我只是指出他认为错误的步骤。我相信他能够通过进一步思考来解决问题。恕我直言,最好将所有东西都放在银色平板电脑上。
    【解决方案3】:

    你可以,这很常见,但现在它是一个相关的可移植性问题,因为它不能在具有 64 位指针和 32 位整数的 x64 平台上使用。

    它可能源于汇编程序的使用,其中寄存器可以很容易地解释为整数和指针。

    在现代用法中并不过分明智,因为它很容易导致错误和混乱。编译器设计中的类型安全改进不允许这种用法,但 C99 重新引入了一些类似的支持,uintptr_tintptr_t 是“能够保存对象指针的整数类型”。

    解释你的问题:

    为什么我们不能将 [a pointer] 分配给 [an integer] 变量?

    答案是:因为不是汇编,C和C++都是strongly typed语言。

    【讨论】:

      【解决方案4】:

      它并不特定于 C 或 C++。这在所有强类型语言中都是一样的。在某种程度上,甚至在英语中也是如此。我们可以说“书的颜色是蓝色的”,但不能说“书的颜色是木头的”。 type 限制了变量可能具有的 values

      int* 类型的变量只能保存整数地址的值,long int 类型的变量只能保存LONG_MINLONG_MAX 之间的值。这只是两组完全不同的价值观。

      C 和 C++ 不是绝对的。类型转换将允许您绕过一些限制。例如。 (int) 3.5 告诉编译器您要将非整数值 3.5 转换为近似相似的整数值。如果这两种类型更相似,这会更好。其他语言可能没有这种类型转换;在那里你可能需要调用一个函数。例如。 ROUND(3.5, INT)

      【讨论】:

      • (int) 3.5 是一个相当糟糕的例子,因为它显示的是转换而不是强制转换。如果它是一个真正的演员,则该值将不是3,而是位序列的解释是什么。
      • @Simon:在 C++ 中,它无疑是一个演员表。准确地说是static_cast<int>。这也是一种转换;两者并不排斥。您似乎在考虑reinterpret_cast,它是其他演员类型之一。但是,你不能reinterpret_cast<int>(3.5)doubleint 不在可能的转换列表中。 (第 5.2.10 节)
      【解决方案5】:

      Niko,恕我直言,类型化语言的意义在于,您不能只将一件事分配给另一件事,即使它们都只是最低级别的一堆位。

      【讨论】:

        【解决方案6】:

        如果地址是整数格式,那么为什么不使用无符号或长整数 整数保存它。我在想,一定有什么隐藏的秘密 在它后面。

        地址不是整数;这是一个地址。在 64 位系统上,这是:

        int *p; 
        

        分配一个 64 位变量,而这个:

        int b; 
        

        分配一个 32 位变量。他们不一样。在某些系统上,它们的大小可能看起来相同,但它们并不相同。以 ++ 运算符为例。在 32 位系统上,指针上的 ++ 将指针递增 4,而整数上的 ++ 将整数递增 1。编译器试图通过告诉您您做错了什么来帮助您。

        【讨论】:

          【解决方案7】:

          指针通常被实现为整数,但 C++ 规范只定义了它们的行为(两个指针在哪里相等或不同等)。

          将指针转换为 uint 就像转换某个其他类/类型的一个实例。

          关于为什么b = (uint) &a; 起作用,可能它是依赖于实现的。 (并且依赖于架构)。

          【讨论】:

            【解决方案8】:

            根据我从您的问题中得到的信息,您的印象是因为地址表示为十六进制,所以它是一个整数。好吧,当然,但这并不意味着您可以按照您的想法将整数放入指针中。

            数据(变量)有它的信息..元数据。它的大小、值、数据类型……存储它的地址。一个指针保存着最后一段元数据,即地址。它是一种特殊的数据类型,主要工作是保存地址。指针的值与数据的值无关,它们是两个独立的东西。指针的值告诉您在哪里可以找到您要查找的数据。这就是为什么您不能以您尝试的方式将整数放入指针中。这就像说你住在某个街道地址,而你也是那个地址。想象一下,如果人们通过您的地址打电话给您,那将是愚蠢的!

            考虑一下:您有一个名为 x 的类,其中包含一些成员。您创建一个指向此类的指针。指针仍然保存一个十六进制格式的地址..但是对象不能被分解为 4 或 8 字节(分别为 32 位和 64 位)值!请注意,所有数据类型的指针格式都是相同的,无论它们的值如何。

             int a;  int *p= &a;
            

            现在..这行得通的原因是因为您将变量 a 的地址放入指针 p 中。关键字是 ADDRESS,这是一个指针所持有的。

             long int a;   
             long int b;   
             b = & a; 
            

            这不起作用,因为您尝试将 a 的 ADDRESS(指针)放入 b,这只是一个变量。

            简单地说,您不能将地址放入普通变量中。地址只能存储在指针中。

            【讨论】:

              【解决方案9】:

              你最初的想法有一个误解:有“正常变量”和“poitners”。 没有这样的概念。只有“变量”和“类型”。

              • int 是“整数值的容器”
              • 类 Person 是 Person 描述的容器。
              • int* 是一个整数地址的容器
              • Person* 是 Person 地址的容器。

              & 运算符返回变量的地址,其类型是“指向该类型的指针”。 赋值只能从给定类型的表达式到兼容类型的变量。 int、int*、Person 和 Person* 互不兼容。 您不能将 int* 分配给 int,原因与您不能将 Person 分配给 int 或将 int 分配给 Person 的原因相同。除非您有一个函数可以让您编写一个从另一种类型返回一种类型的表达式。就像operator & 所做的那样,&a 表达式给了你。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2021-11-28
                • 2015-08-06
                • 1970-01-01
                • 2019-06-01
                • 1970-01-01
                • 2021-07-10
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多