如果
int number[];
int *tommy;
那么以下陈述有什么区别?这两个语句都不会将数字的地址复制给汤米吗?
tommy = &number;
或者
tommy = number;
编辑:对不起,我的意思是 int 数组,而不仅仅是 int。
int number;
定义一个整数number
。int *tommy;
定义tommy
为指向整数的指针。
tommy = &number;
分配number
to的地址tommy
。*tommy
将给出实际数字。
tommy = number
存储number
in的值tommy
。一,应该有一个编译错误,最重要的是,如果你成功存储number
到tommy
,那么*tommy
将尝试从地址与内容相同的无效位置进行延迟,number
并导致分段错误。
后记
我很想如果你看到这样的例子
int a[10];
int *tommy;
tommy = a; // This will work
在本例中,a
是数组的名称,相当于数组的地址或数组的第一个元素,即&a[0]
。因此,存入a
是tommy
有效的。
第一个分配number
into的地址tommy
。第二个尝试将数字分配给number
指针tommy
,它应该无法编译。
编辑
通过编辑,情况正好相反:第一个不应该编译。int 数组的地址是 类型int (*)[size]
,不能转换为int*
。
为了编译您的示例,数组需要一个大小:
int number[1];
因为你不能创建一个未知大小的变量。
tommy = &number;
error: cannot convert ‘int (*)[1]’ to ‘int*’ in assignment
这不应该编译。&number
是指向数组的指针,它不能转换为指向 的指针int
,因此不能分配给该类型的变量。
tommy = number;
这可以。在表达式中使用时,数组可以转换为指向其第一个元素的指针。该指针类型为int*
,与 相同tommy
,因此允许赋值。
不,两者本质上是不同的。表达式的&number
计算结果为存储值的地址number
,而表达式的number
计算结果直接为值本身。
假设 number 的值为42,并且它存储在内存中的地址1024。内存是线性的*,所以它看起来像这样:
+--------+ Address 0
| ...... |
+--------+
| 42 | Address 1024 (value is stored here)
+--------+
| ...... |
+--------+ Address xxxx
现在,该语句tommy = &number;
将值 1024 分配给tommy
,因为&number == 1024
, 的地址number
。
另一个语句,只要它完全编译,就会将(无意义的)值 42(的值number
)分配给tommy
. 任何取消引用(访问指向的数据)的尝试tommy
都可能产生分段错误,因为 42 (可能)不是有效地址。
*至少,操作系统会给你一种地址空间是线性和连续的错觉。
第一个赋值是正确的——它把 的地址赋给number
了指针tommy
。
第二个赋值将赋值给number
指针tommy
。
不,他们不会,&
或者reference operator
它将address of
获取您预先附加的变量的地址,所以这可以满足您的需求:
tommy = &number
当您只使用 plain 时number
,它只返回存储在 number 中的整数值,它不会编译。这个关于指针的参考涉及到更多的细节。
Update:
因此,在对问题进行编辑后,如果没有大小,这将无法编译:
int number[];
这是有效的:
int number[10];
所以现在它被颠倒了,这是有效的并且将编译:
tommy = number ;
第二行尝试将整数数组视为单个整数,编译器不允许这样做,因此它无效:
tommey = &number ;