以下是用
主要功能:
int main ()
{
int a[3]={10,11,12};
printf("%d\n" , arraysum(a,3) );
}
Arraysum 函数定义:
int arraysum (int *addr , int len )
{
int sum = 0, i ;
for (i=0 ; i<len ; i++)
sum += addr[i];
return sum ;
}
输出 33
问题:我知道在main
函数中,数组a
的基地址被传递给指针addr
,但之后我无法了解以下陈述如何运作:
sum+=addr[i];
Q1:接下来,addr是一个指针变量,那么我如何在arraysum
函数中将它用作数组?
Q2:更重要的是,当我将数组a
的基地址传递给指针时,为什么我能够通过它访问数组a
的所有元素?
答案 0 :(得分:3)
Q1:接下来,addr是一个指针变量,那么我如何在arrayum函数中将它用作数组呢?
实际上,你有这种倒退。下标运算符[]
适用于指针,而不适用于数组。咦?我在说什么?那么当array[i]
array
是一个数组时,数组实际上衰减到指向其第一个元素的指针。所以你总是将[]
应用于指针。在您的情况下,addr
已经指向其第一个元素的指针。
Q2:更重要的是,当我将数组a的基地址传递给指针时,我怎么能通过它访问数组a的所有元素?
执行something[i]
时,它等同于*((something) + (i))
。这只是基本的指针算法。将指针指向第一个元素,将指针递增i
,然后取消引用它。
正是由于这种指针运算,我们可以通过指向其中一个元素的指针来访问数组的所有元素。
答案 1 :(得分:2)
Q1:您可以将指针索引为数组(事实上,数组索引实际上是指针索引)。所以
addr[i]
与*(addr + i)
Q2:因为当您将数组传递给期望指针的函数时,该数组会衰减到指向其第一个元素的指针。因此addr
指向a
的第一个元素。这是相同现象的简化版本,没有函数调用:
int a[] = {1, 2, 3}; // size 3 array of int
int * p = a; // OK: a decays to int*. p points to &a[0]
p[0]; // same as a[0]
请注意,尽管如此,a
和p
的类型也不同。 a
是int
的3号数组。该类型包含大小信息。 p
只是指向int
的指针。它可以指向数组的元素,但也可以指向单个int
。
答案 2 :(得分:2)
基本上int * addr指向数组中的第一个元素。所以如果你说addr [i]它等于*(addr + i),它指向第i个元素。
答案 3 :(得分:0)
当您将plain array
传递给函数时,它会衰减为pointer
。所以,我们从现在开始讨论pointer
。
如果您获得pointer
内存位置(ptr)
,那么您可以使用它做什么: -
de-reference it
*ptr
increment it
++ptr;
等...
所以,这个函数不知道你有一个数组。你碰巧在这个函数中表现为pointer is pointer into as array
。这意味着当数组元素位于连续的内存位置时,您可以将其递增以获取数组的下一个元素。但是,您必须确保不要越过边界。为此,您明确地将size of array
传递给此函数。