为什么这个函数在没有指针的情况下改变列表值

Why does this function change list value without pointer?

本文关键字:情况下 改变 列表 指针 函数 为什么      更新时间:2023-10-16

如果我传递一个值给一个函数,它不做一个值的副本,这样,如果我在函数内改变它,它不会改变原来的,除非我传递它的地址?这可能是一个愚蠢的问题,但我不明白为什么这个函数会改变列表的值。

void array_increment(int list[],int SIZE) 
{
    for (int i=0; i<SIZE; i++)
        list[i] = list[i]+1;
}
int main() 
{
    int c[]={3,1,0,-5,1};
    array_increment(c,5);
    for (int i = 0; i < 5; i ++)
        cout << c[i] << " ";
    cout << endl;
}   
4 2 1 -4 2
void array_increment(int list[], int SIZE) 

等价于

void array_increment(int* list, int SIZE) 

所以形参是一个指针

对于像指针这样的基本类型,它只是一个浅拷贝。指针本身被复制了,但它所指向的对象却没有被复制。因此,函数内部的list变量仍然指向函数外部的数组。

有几个问题。

  1. 普通数组不可复制或分配。
  2. int a[]等功能参数将调整为指向int* a
  3. 数组名可以衰变衰变为指向其第一个元素的指针

第二个点意味着

void array_increment(int list[],int SIZE) 

void array_increment(int* list,int SIZE) 

和第三点意味着你可以传递数组c作为第一个参数,因为它可以衰减到int*