如何使用指针将数组作为函数参数传递的代码片段解释?

3
以下是在C语言中添加数组元素的代码片段!
主函数:
```c #include int main() { int array[5] = {1, 2, 3, 4, 5}; int sum = 0; for(int i = 0; i < 5; i++) { sum += array[i]; } printf("Sum of array is: %d", sum); return 0; } ```
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];

问题1:接下来,addr是一个指针变量,那么在arraysum函数中我如何将其用作数组?

问题2:更重要的是,当我将数组a的基地址传递给指针时,我如何通过它访问数组a的所有元素?


  1. sum += addr[i] 可以理解为sum = sum + addr[i],如果更容易理解的话。
  2. 在函数arraysum中可以使用数组,因为它仍然存在,并且您有指向内存中第一个元素的指针。
  3. 您可以循环访问内存中的地址,因为数组的元素是这样存储的。
- Rizier123
4个回答

3

Q1: 然后,addr是一个指针变量,那么我如何在arraysum函数中将其用作数组?

实际上,你的理解是反过来的。下标操作符[]适用于指针而不是数组。什么意思呢?当你使用array[i]其中array是一个数组时,该数组实际上会衰减为指向其第一个元素的指针。因此,你总是将[]应用于指针。在你的情况下,addr已经是指向其第一个元素的指针。

Q2: 更重要的是,当我将数组a的基地址传递给指针时,我如何能够通过它访问所有数组a的元素?

当你执行something[i]时,相当于*((something) + (i))。这只是基本的指针算术。将指向第一个元素的指针增加i,然后对其进行解引用。

正是由于这种指针算术,我们可以通过指向其元素之一的指针访问数组的所有元素。


2

问题1: 您可以将指针索引视为数组(实际上,数组索引确实是指针索引)。因此

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具有不同的类型。 a是一个包含大小信息的int数组,大小为3. p只是一个指向int的指针。它可以指向数组的元素,但也可以指向单个int

2

基本上,int *addr 指向数组中的第一个元素。因此,如果你说 addr[i],它等于 *(addr + i),它指向第 i 个元素。


0

当您将 普通数组 传递给函数时,它会衰减为一个 指针。因此,从现在开始我们将讨论 指针

如果您获得一个指向内存位置 (ptr)指针,那么您可以做哪些事情:

de-reference it
     *ptr

increment it 
     ++ptr;

所以,这个函数不知道你有一个数组。在这个函数中,你表现得好像这个指针是指向数组的指针。这意味着你可以将它递增到下一个数组元素,因为数组元素在连续的内存位置中。但是,你必须确保不要越界。为此,你需要显式地将数组大小传递给这个函数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接