了解CPP指针

时间:2013-03-22 13:13:20

标签: c++ pointers integer

如果

int number[];
int *tommy;

那么以下陈述中的差异是什么?这两个陈述都不会将号码的地址复制到tommy吗?

tommy = &number;

OR

tommy = number;
编辑:对不起伙计我的意思是int数组而不仅仅是int。

6 个答案:

答案 0 :(得分:2)

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

修改

通过编辑,反过来说:第一个不应该编译。 int数组的地址类型为int (*)[size],无法转换为int*

答案 1 :(得分:2)

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

tommy = &number;number的地址指定给tommy*tommy将提供实际数字。

tommy = numbernumber的值存储在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;

这很好。在表达式中使用时,可以将数组转换为指向其第一个元素的指针。 int*相同,因此允许分配。

答案 3 :(得分:0)

第一个分配是正确的 - 它将number的地址分配给指针tommy

第二项作业会将number指定给指针tommy

答案 4 :(得分:0)

不,他们不会,&reference operatoraddress 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 == 1024number的地址。

另一个声明,如果它完全编译,将把(无意义的)值42(number的值)分配给tommy。任何取消引用(访问指向的数据)tommy的尝试都可能产生分段错误,因为42(可能)不是有效地址。

*至少,操作系统会让你觉得你的地址空间是线性的和连续的。