【问题标题】:Array in main() changes in a functionmain() 中的数组在函数中发生变化
【发布时间】:2020-10-01 16:27:33
【问题描述】:

我有一个程序可以对某个数字进行排序:

#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 变量不会影响第二个程序中的 data 变量?
  3. 是否可以使 x[] 数组独立于 data[] 数组?
    如果这是一个愚蠢的问题并且我的英语不好,我很抱歉。谢谢。

【问题讨论】:

  • 函数声明void sort(int x[], int sizeArr)void sort(int *x, int sizeArr)相同。也就是说,您将 pointer 传递给数组的第一个元素。你没有传递数组本身。
  • (这是你必须学习的那些奇怪的 C 规则之一。不,没有任何逻辑)

标签: arrays c variables


【解决方案1】:

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

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

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


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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-16
    • 2020-06-05
    相关资源
    最近更新 更多