我想知道什么是真正的回报?

假设

第一个案例

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 

整数,甚至是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都具有相同的底层位模式。

返回一个无符号整数的地址

不,不是。 指针(地址)是指针。 期。

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

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

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

用你的问题来解释:

为什么我们不能将[指针]分配给[整数]变量?

答案是:因为它不是汇编程序,所以C和C ++是强类型语言。

它不是特定于C或C ++。 所有强类型语言都是一样的。 它在某种程度上甚至可以用英语表达。 我们可以说“书的颜色是蓝色的”,但不是“书的颜色是木”。 类型限制变量可能具有的

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

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

Niko,恕我直言,键入语言的一点是你不能只为另一个分配一个东西,即使它们只是最低级别的一堆位。

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

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

 int *p; 

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

 int b; 

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

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

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

关于为什么b = (uint) &a; 工作,可能是依赖于实现的。 (和拱相关)。

从我的问题出发,您的印象是因为地址表示为hex,所以它是一个整数。 嗯,当然,但这并不意味着你可以按照你想的方式将整数放入指针中。

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

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

  int a; int *p= &a; 

现在..这个工作的原因是因为你取了变量a的地址并把它放到指针p中。 关键字是ADDRESS,这是指针所持有的。

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

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

简而言之,您不能将地址放入正常变量中。 地址只能存储在指针中。

你的初始思维中存在一种误解:存在“正常变量”和“poitners”。 没有这样的概念。 只有“变量”和“类型”。

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

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