在我学习C ++的过程中,我遇到了这段代码:
int &get(int *arry, int index) { return arry[index]; }
int main() {
int ia[10];
for (int i = 0; i != 10; ++i)
get(ia, i) = i;
我的问题是,它是如何运作的?
由于arry
是一个指针,这怎么可能?
答案 0 :(得分:3)
事实上,内置的[]
语法只能在指针上使用 。在数组上使用它时,数组首先decayed成为指向其第一个元素的指针,然后将其编入索引。
在您的示例中,将数组作为参数传递给函数时,数组会被衰减。这里没有数组引用。
答案 1 :(得分:1)
让数组a [10]的基址为1000.因此,如果要访问数组a的索引2中的元素,则编写[2]。根据编译器对此语句的解释是:
a [2] = 1000 +(2 * 2)= 1004
因此,您可以通过以下公式访问任何元素:
a [index] = base_address +(sizeof datatype * index no)
现在,回到你的问题,当你只给出ai
中的数组名称时,实际上是在传递数组的基地址。这就是您在函数参数中使用指针符号的原因。int *arry, int index
。
您必须了解以下内容:
int a,*b,c;
a=8;
b=&a;
c=*b;
当您打印c时,您将获得8。
因此,如果index为2,则行arry[index]
将被解释为:
(base_address)+(sizeof int * 2)
答案 2 :(得分:0)
在C ++中,您可以将数组 - in this situation - 视为指向该数组中第一个项目的指针,其中数组中的所有项目在内存中依次排列:
_____
| 6 | <-- ai
| 9 |
| 4 |
|__2__|
那么,*ai
应该产生6
。
*(ai+1)
应为9
,依此类推......(事实证明,ai[x]
为syntactic sugar - 它直接转换为 - {{ 1}})
传入数组时,只传递指向第一个项目的指针。然后,该函数通过引用返回*(ai+x)
的值。这意味着如果我们更改返回值,我们实际上正在更改arry[index]
,我们知道这是arry[index]
。
这有意义吗?