如果
int number[];
int *tommy;
那么以下陈述有什么区别?这两个语句都不会将数字的地址复制给汤米吗?
tommy = &number;
或者
tommy = number;
编辑:对不起,我的意思是 int 数组,而不仅仅是 int。
int number;定义一个整数number。int *tommy;定义tommy为指向整数的指针。
tommy = &number;分配numberto的地址tommy。*tommy将给出实际数字。
tommy = number存储numberin的值tommy。一,应该有一个编译错误,最重要的是,如果你成功存储number到tommy,那么*tommy将尝试从地址与内容相同的无效位置进行延迟,number并导致分段错误。
后记
我很想如果你看到这样的例子
int a[10];
int *tommy;
tommy = a; // This will work
在本例中,a是数组的名称,相当于数组的地址或数组的第一个元素,即&a[0]。因此,存入a是tommy有效的。
第一个分配numberinto的地址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 ;