假设
第一种情况
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个字节为什么我们不能将地址存储在其他变量中如果地址是整数值那就是我的问题我找到了许多答案,比如++它将指针和值1增加4到变量,不要担心只是分配值是更重要的问题。
b = & a ; address of a is 4000
++b ; becomes 4001 thats it,thats not a problem
答案 0 :(得分:22)
整数,即使long int
,也不总是与指针大小相同。有时他们会(例如,大多数32位架构都有sizeof(int) == sizeof(void *)
),有时它们会有所不同(例如,某些64位架构有sizeof(long) == sizeof(void *)
但有些架构没有 - Visual C ++ on Windows是sizeof(long) != sizeof(void *)
)的编译器的主要示例。
还有一个事实是,void *
与<{1}}的类型不同。
想象一下课程long int
和课程Foo
,定义如下:
Bar
这就像问为什么你不能将类class Foo {
public: int a;
};
class Bar {
public: int b;
};
的实例分配给类型为Foo
的变量 - 它们不是同一个东西,即使在这种情况下都是{{1} }和Bar
具有相同的基础位模式。
答案 1 :(得分:7)
返回无符号整数的地址
不,不是。 指针(地址)是指针。周期。
答案 2 :(得分:6)
你可以而且非常普遍,它现在是一个相关的可移植性问题,因为它不能在具有64位指针和32位整数的x64平台上使用。
它可能源于汇编程序用法,其中寄存器可以很容易地解释为整数和指针。
在现代使用中并不过分明智,因为它很容易导致错误和混乱。编译器设计中的类型安全性改进不允许这样的用法,但C99重新引入了一些类似的支持,uintptr_t
和intptr_t
是“能够保存对象指针的整数类型”。
用你的问题来解释:
为什么我们不能将[指针]分配给[整数]变量?
答案是:因为它不是汇编程序,所以C和C ++是strongly typed种语言。
答案 3 :(得分:3)
它不是特定于C或C ++。所有强类型语言都是一样的。这在某种程度上甚至是英语真实的。我们可以说“书的颜色是蓝色的”,但不是“书的颜色是木”。 类型限制变量可能具有的值。
变量int*
类型只能包含int的地址值,而long int
类型的变量只能包含LONG_MIN
和LONG_MAX
之间的值。这只是两组完全不同的价值观。
C和C ++不是绝对的。类型转换将允许您绕过一些限制。例如。 (int) 3.5
告诉编译器您要将非整数值3.5转换为近似相似的整数值。如果两种类型更相似,则效果更好。其他语言可能没有这样的类型转换;你可能需要调用一个函数。例如。 ROUND(3.5, INT)
答案 4 :(得分:2)
Niko,恕我直言,键入语言的一点是,你不能只为另一个分配一个东西,即使它们只是最低级别的一堆比特。
答案 5 :(得分:2)
如果地址是整数格式,那么为什么不签名或长 整数保存它。我在想,必须有一些隐藏的秘密 背后。
地址不是整数;这是一个地址。在64位系统上,这个:
int *p;
分配一个64位变量,而这个:
int b;
分配一个32位变量。他们不一样。它们在某些系统上可能看起来大小相同,但它们并不相同。仅考虑++运算符的一个示例。在32位系统上,指针上的++将指针递增4,而整数上的++将整数递增1.编译器试图通过告诉您做错了事来帮助您。
答案 6 :(得分:1)
指针通常以整数形式实现,但C ++规范只定义它们的行为(两个指针的位置相同或不同等)。
将指针转换为uint就像转换其他类/类型的一个实例一样。
关于b = (uint) &a;
的工作原理,可能是依赖于实现的。 (和拱相关)。
答案 7 :(得分:1)
从我的问题出发,您的印象是因为地址表示为十六进制,所以它是一个整数。嗯,当然,但这并不意味着你可以按照你想的方式将整数放入指针。
数据(变量)具有信息...数据。它的大小,值,数据类型....存储它的地址。指针持有最后一段元数据,即地址。它是一种特殊的数据类型,主要工作是保存地址。指针的值与数据的值无关,它们是2个单独的东西。指针的值告诉您在哪里可以找到您要查找的数据。这就是为什么你不能以你正在尝试的方式将整数放入指针。这就像说你住在一些街道地址,你也是那个地址。想象一下,如果有人用你的地址打电话给你,那就太傻了!
考虑一下:你有一个名为x的类,它包含一些成员。您创建一个指向此类的指针。指针仍然保存一个十六进制格式的地址..但是对象不能分成4或8字节(分别为32位和64位)值!请注意,所有数据类型的指针格式都是相同的,无论它们的值如何。
int a; int *p= &a;
现在..之所以这样做是因为你把变量a的地址放到指针p中。关键字是ADDRESS,这是指针所持有的。
long int a;
long int b;
b = & a;
这不起作用,因为您尝试将a的ADDRESS(指针)放入b,这只是一个变量。
简单地说,你不能将地址放入普通变量中。地址只能存储在指针中。
答案 8 :(得分:0)
你的初始思维中存在一种误解:有“正常变量”和“poitners”。 没有这样的概念。只有“变量”和“类型”。
&amp; operator返回变量的地址,其类型是“指向该类型的指针”。
分配只能从给定类型的表达式转换为兼容类型的变量。
int,int *,Person和Person *彼此不兼容。
您无法将int *分配给int,原因与您无法将Person分配给int或将int分配给Person的原因相同。除非你有一个函数可以让你写一个表达式从另一个返回一个类型。就像operator &
一样,&a
表达式给你。