[英]Array in main() changes in a function
我有一個程序來排序一些數字:
#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, x
是指向內存塊的指針。 在函數內部和外部引用相同的內存,因此如果您更改函數內部的內存,您將在函數外部看到相同的更改。
對於 2, x
是傳遞給函數的 3 的副本。 x
內部的x
和函數外部的data
指的是內存中的不同位置。 x = 5
更改x
內存位置中的內容,但由於該內存只是data
保存內容的副本,因此不會影響data
。
對於 3,您需要制作數組的副本。 這可以通過創建第二個數組然后使用循環將每個元素復制到新數組來手動完成,或者您可以使用像memcpy
這樣的函數。
要記住的一個關鍵是,您傳遞給函數的任何內容都會被復制。 如果您傳遞一個指針,則該指針將被復制,但是當通過執行x[j]
類的操作取消引用時,地址的副本仍然是相同的地址。 如果您傳入一個整數之類的東西,該整數將被復制,因此重新分配它不會在函數之外產生任何影響。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.