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

nik*_*iko 7 c c++ pointers programming-languages reference

假设

第一个案例

 int a;
 int *p= &a ; it works no error
Run Code Online (Sandbox Code Playgroud)

第二种情况

 long int a;
 long int b;
 b = & a; it wont work 
Run Code Online (Sandbox Code Playgroud)

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

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

b = (unsigned int) &a ; it works after typecasting though its not practicable.
Run Code Online (Sandbox Code Playgroud)

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

感谢您的所有答案,但实际问题究竟是什么&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?
Run Code Online (Sandbox Code Playgroud)

以16位为例,正常指针(地址)大小为2个字节,可变大小为2个字节为什么我们不能将地址存储在其他变量中如果地址是整数值那就是我的问题我发现许多答案如++它增加4将指针和值1转换为变量,不要担心只是分配值是更重要的问题.

  b = & a ; address of a is 4000
  ++b ; becomes 4001 thats it,thats not a problem 
Run Code Online (Sandbox Code Playgroud)

Dea*_*ing 22

甚至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;
};
Run Code Online (Sandbox Code Playgroud)

这就像问你为什么不能类的实例分配Foo给类型的变量Bar-它们是不一样的东西,即使在这种情况下,两个FooBar具有相同的底层位模式.


Ing*_*ngo 7

返回无符号整数的地址

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


Ste*_*e-o 6

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

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

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

用你的问题来解释:

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

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