如果
int number[];
int *tommy;
那么以下陈述中的差异是什么?这两个陈述都不会将号码的地址复制到tommy吗?
tommy = &number;
OR
tommy = number;
编辑:对不起伙计我的意思是int数组而不仅仅是int。
答案 0 :(得分:2)
第一个将number
的地址分配到tommy
。第二个尝试将数字number
分配给指针tommy
,它应该无法编译。
修改强>
通过编辑,反过来说:第一个不应该编译。 int数组的地址类型为int (*)[size]
,无法转换为int*
。
答案 1 :(得分:2)
int number;
定义整数number
。 int *tommy;
将tommy
定义为指向整数的指针。
tommy = &number;
将number
的地址指定给tommy
。 *tommy
将提供实际数字。
tommy = number
将number
的值存储在tommy
中。一,应该有一个编译错误,如果你成功将number
存储到tommy
,那么*tommy
将尝试从一个地址相同的无效位置推迟number
的内容会导致细分错误。
<强>后记强>
我很想想你是否看到了这个例子
int a[10];
int *tommy;
tommy = a; // This will work
在此示例中,a
是数组的名称,等同于数组的地址或数组的第一个元素,即&a[0]
。因此,将a
存储到tommy
中是有效的。
答案 2 :(得分:1)
对于要编译的示例,数组将需要一个大小:
int number[1];
因为您无法创建未知大小的变量。
tommy = &number;
error: cannot convert ‘int (*)[1]’ to ‘int*’ in assignment
这不应该编译。 &number
是指向数组的指针,该数组不能转换为指向int
的指针,因此不能分配给该类型的变量。
tommy = number;
这很好。在表达式中使用时,可以将数组转换为指向其第一个元素的指针。 1}}指针类型与int*
相同,因此允许分配。
答案 3 :(得分:0)
第一个分配是正确的 - 它将number
的地址分配给指针tommy
。
第二项作业会将number
的值指定给指针tommy
。
答案 4 :(得分:0)
不,他们不会,&
是reference operator
或address of
,它会将您预先附加的变量的地址带到,所以这可以满足您的需求:
tommy = &number
当你只使用普通number
时,它只返回存储在number中的整数值,这将不会编译。这个reference指针进入了更多的细节。
Update:
因此,在编辑问题之后,如果没有大小,则无法编译:
int number[];
这是有效的:
int number[10];
所以现在它被反转,这是有效的并且将编译:
tommy = number ;
第二行尝试将整数数组视为单个整数,编译器不允许这样做,因此它无效:
tommey = &number ;
答案 5 :(得分:0)
不,两者根本不同。表达式&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(可能)不是有效地址。
*至少,操作系统会让你觉得你的地址空间是线性的和连续的。