关于如何使用指针将数组作为函数参数传递的代码片段的说明?

时间:2014-12-18 13:47:06

标签: c arrays pointers

以下是用语言添加数组元素的 CODE SNIPPET

主要功能:

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的所有元素?

4 个答案:

答案 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]

请注意,尽管如此,ap的类型也不同。 aint的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传递给此函数。