首页 > 解决方案 > main() 中的数组在函数中发生变化

问题描述

我有一个程序来排序一些数字:

#include <stdio.h>
void sort(int x[], int sizeArr){
    int i,j,temp=0;
    for(i=0;i<sizeArr;i++){
        for(j=0;j<sizeArr-1;j++){
            if(x[j]>x[j+1]){
                temp=x[j];
                x[j]=x[j+1];
                x[j+1]=temp;
            }
        }
    }
}

int main()
{
    int data[]={5,1,2,4,3};
    int sizeArr = sizeof(data)/sizeof(data[0]);
    int i;
    printf("Data Array\n");
    for(i=0;i<sizeArr;i++){
        printf("Data no.%d= %d\n", i+1, data[i]);
    }
    printf("\n");
    sort(data,sizeArr);
    printf("Data Array\n");
    for(i=0;i<sizeArr;i++){
        printf("Data no.%d= %d\n", i+1, data[i]);
    }
    return 0;
}

结果:

Data Array
Data no.1= 5
Data no.2= 1
Data no.3= 2
Data no.4= 4
Data no.5= 3

Data Array
Data no.1= 1
Data no.2= 2
Data no.3= 3
Data no.4= 4
Data no.5= 5

还有一个类似的程序,但没有数组:

#include <stdio.h>
void sort(int x){
    x=5;
}
int main()
{
    int data=3;
        printf("Data = %d\n", data);
    printf("\n");
    sort(data);
        printf("Data = %d\n", data);
    return 0;
}

结果:

Data = 3

Data = 3

我想问的是:

  1. sort() 中x[]数组的变化如何影响main() 中的data[]数组?
  2. 为什么x变量不影响第二个程序中的数据变量?
  3. 是否可以使x[]数组独立于data[]数组?
    如果这是一个愚蠢的问题并且我的英语不好,我很抱歉。谢谢。

标签: arrayscvariables

解决方案


对于 1,x是指向一块内存的指针。函数内部和外部都引用了相同的内存,因此如果您更改函数内部的内存,您将在函数外部看到相同的更改。

对于 2,x是传递给函数的 3 的副本x函数内部和函数data外部指的是内存中的不同位置。x = 5更改x内存位置中的内容,但由于该内存只是data保存内容的副本,因此不会影响data.

对于 3,您需要制作数组的副本。这可以通过创建第二个数组然后使用循环将每个元素复制到新数组来手动完成,或者您可以使用类似memcpy.


要记住的一个关键是你传递给函数的任何内容都会被复制。如果你传递一个指针,指针会被复制,但是当一个地址的副本被取消引用时,它仍然是同一个地址x[j]。如果您传入整数之类的东西,则会复制该整数,因此重新分配它不会在函数之外产生任何影响。


推荐阅读