2015-12-30 45 views
0

我目前正在学习关于在这个link的C编程中的指针。逻辑是如何工作的,将反向数组赋给一个指针

我对指针的理解是,指针将实际地址的值存储在变量的内存中。

比方说,我有

int var[] = {10, 100, 200}; 
int *ptr; 

通过分配varptr

ptr = var; 

ptr将在同一顺序排列的地址包含。我的问题,

有一个减少指针的例子。使用数组和指针。 示例使用

ptr = &var[MAX-1]; 

为什么通过使用上述代码,指针ptr可以包含阵列相反的顺序进行。

+3

'ptr'是指向'var'的最后一个(MAX-1')元素的指针。它没有订单。如果你从它向后移动到数组的开头,你将以相反的顺序在数组中移动。 – Ryan

+0

本教程非常笨拙,但您似乎已经掌握了对指针的很好理解。语法'ptr =&var [MAX-1];'初始化'ptr'指向数组中的最后一个元素。在循环中递减'ptr'可以让您按照* reverse *顺序枚举数组元素,但是数组本身不会改变。 – chqrlie

+0

只是为了说清楚:对于'ptr = var',你不会**将'ptr'设置为数组的地址,而是设置为第一个元素的地址,因为对于大多数用法,数组名称是隐式转换的(衰减)到指向其第一个元素的指针。这可能听起来有点挑剔,因为大多数实现都具有相同的**值**。但他们有不同的类型。数组的地址始终是'&var'。尝试'ptr =&var',你会得到一个类型错误的错误,除非你定义了int(* ptr)[];'。 – Olaf

回答

2

分配:

ptr = var 

存储在指针ptr即阵列,这是同样的事情数组的第一元素的地址的地址的var,地址。究其原因是因为内存是通过以下方式进行组织:

+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+ ... 
| 10 | 100 | 200 | values of other variables, including i, ptr, etc.  
+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+ ... 
^ ^ ^
    |  |  | 
var[0] var[1] var[2] 
^
    | 
var 

的算子的&variable用C得到variable地址。换句话说,分配

ptr = var 

是相同的:

ptr = &var[0] 

以相同的方式,分配:

ptr = &var[MAX-1] 

分配给指针最后元素的地址(其索引为MAX-1,即2)。

在循环的每次迭代中,由指针指向的变量的值被印刷,并且的ptr值递减在第二回路(注意在第一实施例中使用的ptr--代替ptr++),从而数组的值从最后一个打印到第一个。

0

编号C中的数组只是连续的记忆区域。他们没有大步或其他任何与他们相关的元数据(尽管如果在声明中给出一个元数据,它们可能会有一定的大小)。您不能创建一个通过内存“向后”递增的数组。

1

它不包含数组的相反顺序。简单来说,它会指出 到该阵列的最后一个位置地址。

10 20 30 //<-- values 
1100 1104 1108 //<-- let's take pointer address. 

这条线之后,

ptr = &var[MAX-1]; 

ptr will points to 1108. //memory address 

因此,如果您递减指针值,那么它会递减的地址位置,并得到以相反的顺序值。因此它将打印输出为

30 20 10 
相关问题