arrays - 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
我想问的是:
- sort() 中x[]数组的变化如何影响main() 中的data[]数组?
- 为什么x变量不影响第二个程序中的数据变量?
- 是否可以使x[]数组独立于data[]数组?
如果这是一个愚蠢的问题并且我的英语不好,我很抱歉。谢谢。
解决方案
对于 1,x
是指向一块内存的指针。函数内部和外部都引用了相同的内存,因此如果您更改函数内部的内存,您将在函数外部看到相同的更改。
对于 2,x
是传递给函数的 3 的副本。x
函数内部和函数data
外部指的是内存中的不同位置。x = 5
更改x
内存位置中的内容,但由于该内存只是data
保存内容的副本,因此不会影响data
.
对于 3,您需要制作数组的副本。这可以通过创建第二个数组然后使用循环将每个元素复制到新数组来手动完成,或者您可以使用类似memcpy
.
要记住的一个关键是你传递给函数的任何内容都会被复制。如果你传递一个指针,指针会被复制,但是当一个地址的副本被取消引用时,它仍然是同一个地址x[j]
。如果您传入整数之类的东西,则会复制该整数,因此重新分配它不会在函数之外产生任何影响。
推荐阅读
- azure-ad-b2c - 在 Android 中使用 MSAL 时如何从 IAuthenticationResult 获取 B2CUser
- android - Kotlin CameraX 无法捕获图像
- python - 如何在 python pandas 或大查询上对多个列进行枢轴操作。最好在大查询上
- windows - 将文件类型/扩展名与 Inno Setup 中 .exe 文件中的非主图标相关联
- javascript - 为什么在 vue 3 watch 上不调用对象突变?
- reactjs - 如何在react js中使用从useQuery获得的graphql枚举进行表单竞争?
- r - 无法在 Shiny 中更改 bs4Dash “深色”皮肤主题背景
- angular - Angular 10 项目,[错误 TS2322:类型“事件”不可分配给类型“字符串”]
- c++-winrt - 如何打开 xaml 设计器?
- next.js - Swiper.js 导航按钮在生产模式下消失