-2

如果

int number[];
int *tommy;

那么以下陈述有什么区别?这两个语句都不会将数字的地址复制给汤米吗?

tommy = &number;

或者

tommy = number;

编辑:对不起,我的意思是 int 数组,而不仅仅是 int。

4

6 回答 6

2

int number;定义一个整数numberint *tommy;定义tommy为指向整数的指针。

tommy = &number;分配numberto的地址tommy*tommy将给出实际数字。

tommy = number存储numberin的值tommy。一,应该有一个编译错误,最重要的是,如果你成功存储numbertommy,那么*tommy将尝试从地址与内容相同的无效位置进行延迟,number并导致分段错误。

后记

我很想如果你看到这样的例子

int a[10];
int *tommy;

tommy = a; // This will work

在本例中,a是数组的名称,相当于数组的地址或数组的第一个元素,即&a[0]。因此,存入atommy有效的。

于 2013-03-22T13:25:35.523 回答
2

第一个分配numberinto的地址tommy。第二个尝试将数字分配给number指针tommy,它应该无法编译。

编辑

通过编辑,情况正好相反:第一个不应该编译。int 数组的地址是 类型int (*)[size],不能转换为int*

于 2013-03-22T13:15:24.600 回答
1

为了编译您的示例,数组需要一个大小:

int number[1];

因为你不能创建一个未知大小的变量。

tommy = &number;

error: cannot convert ‘int (*)[1]’ to ‘int*’ in assignment

这不应该编译。&number是指向数组的指针,它不能转换为指向 的指针int,因此不能分配给该类型的变量。

tommy = number;

这可以。在表达式中使用时,数组可以转换为指向其第一个元素的指针。该指针类型为int*,与 相同tommy,因此允许赋值。

于 2013-03-22T13:29:59.827 回答
0

不,两者本质上是不同的。表达式的&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 (可能)不是有效地址。

*至少,操作系统会给你一种地址空间是线性和连续的错觉。

于 2013-03-22T13:22:34.113 回答
0

第一个赋值是正确的——它把 的地址赋给number了指针tommy

第二个赋值将赋值number指针tommy

于 2013-03-22T13:15:32.460 回答
0

不,他们不会,&或者reference operator它将address of获取您预先附加的变量的地址,所以这可以满足您的需求:

tommy = &number

当您只使用 plain 时number,它只返回存储在 number 中的整数值,它不会编译。这个关于指针的参考涉及到更多的细节。

Update:

因此,在对问题进行编辑后,如果没有大小,这将无法编译:

int number[];

这是有效的:

int number[10];

所以现在它被颠倒了,这是有效的并且将编译:

tommy = number ;

第二行尝试将整数数组视为单个整数,编译器不允许这样做,因此它无效:

tommey = &number ;
于 2013-03-22T13:15:39.397 回答