Programming languages 我不知道真正的&;a返回?

Programming languages 我不知道真正的&;a返回?,programming-languages,c++,c,pointers,reference,Programming Languages,C++,C,Pointers,Reference,假设 第一例 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 typecast

假设

第一例

 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\如果地址b的值为65535,为什么int a=&b无效

我不担心将其用作指针,请注意,问题只是保存值。没有推迟地址。人们说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 

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

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

它在现代用法中不太合理,因为它很容易导致错误和混乱。编译器设计中的类型安全改进不允许这种使用,但C99重新引入了一些类似的支持,包括
uintpr\u t
intptr\u t
,它们是“能够容纳对象指针的整数类型”

套用你的问题:

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


<> >答案是:因为它不是汇编程序,C和C++是语言。

< P>它不是C或C++的特定。这在所有强类型语言中都是相同的。在某种程度上,英语也是如此。我们可以说“书的颜色是蓝色的”,但不能说“书的颜色是木制的”。类型限制变量可能具有的值

变量
int*
类型只能保存int地址的值,而
long int
类型的变量只能保存
long_MIN
long_MAX
之间的值。这只是两组完全不同的值

C和C++不是绝对的。类型转换将允许您绕过一些限制。例如,

(int)3.5
告诉编译器要将非整数值3.5转换为近似的整数值。如果这两种类型更相似,效果会更好。其他语言可能没有这种类型转换;在这里,您可能需要调用一个函数。例如,
ROUND(3.5,INT)

返回无符号整数的地址

不,不是。
指针(地址)是指针。句号。

Niko,我想,类型化语言的要点是,你不能只把一件事分配给另一件事,即使它们都只是最低级别上的一堆位。

整数,即使是
long int
,也不总是与指针大小相同。有时,它们将是(例如,大多数32位架构具有<代码> siZeF(int)=sisiof(空隙*)<代码>),有时它们将不同(例如,64位架构具有<代码> siZoF(long)=sisiof(空隙*)< /C> >但有些则不可见——Visual C++在Windows上是编译器的一个主要例子,其中代码> sisiof(long)!(无效*))

还有一个事实是,
void*
long int
的类型不同

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

class Foo {
   public: int a;
};

class Bar {
   public: int b;
};

这就像问为什么不能把类的实例<代码> Foo<代码>分配给一个变量<代码> bar >代码>它们不是同一个东西,即使在这种情况下, Foo和 Bar 都有相同的基础位模式。

指针通常被实现为整数,但是C++规范只定义了它们的B。ehaviour(其中两个指针相等或不同,等等)

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

关于
b=(uint)&a;
工作的原因,可能是依赖于实现(和arch)

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

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

int *p; 
分配64位变量,而这:

int b; 

分配一个32位变量。它们不相同。它们可能在某些系统上看起来是相同的大小,但它们不一样。只考虑一个例子:++操作符。在一个32位的系统上,指针上的++增加了指针的4,而整数上的++使整数增加了1。编译器试图通过告诉你来帮助你。你做错事了。

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

数据(变量)包含信息。元数据。它的大小,
 int a;  int *p= &a;
 long int a;   
 long int b;   
 b = & a;