陣列與函式
陣列名
陣列的記憶體大小是連續
1
int array[5] = {10, 20, 30, 40, 50};
因為int是4byte記憶體大小,所以每一格記憶體位址都是4byte的差距。
位址 內容
0x1000 10 ← array[0]
0x1004 20 ← array[1]
0x1008 30 ← array[2]
0x100C 40 ← array[3]
0x1010 50 ← array[4]
在main()函式中的陣列名存放的是array[0]的記憶體位址
位址 內容
0x1000 0x1000 ← array, &array, &array[0]
以下的程式,main()函式中,印出arr、&arr、&arr[0],都是印出array[0]的記憶體位址。
1
2
3
4
5
6
7
8
9
int main() {
int arr[3];
printf("main arr= %p \n", arr);
printf("main &arr= %p \n", &arr);
printf("[0]= %p \n", &arr[0]);
printf("[1]= %p \n", &arr[1]);
printf("[2]= %p \n", &arr[2]);
return 0;
}
main arr= 0x7ff7bfeff2dc
main &arr= 0x7ff7bfeff2dc
[0]= 0x7ff7bfeff2dc
[1]= 0x7ff7bfeff2e0
[2]= 0x7ff7bfeff2e4
陣列與函式
函式參數
方式1,參數是指標。
1
2
3
4
void func1(int* arr) {
printf("func1 &arr= %p \n", &arr);
printf("func1 arr= %p \n", arr);
}
方式2,參數是陣列[]
但沒大小。
1
2
3
4
void func1(int arr[]) {
printf("func1 &arr= %p \n", &arr);
printf("func1 arr= %p \n", arr);
}
函式參數是指標*
或沒有大小的陣列[]
,都是指標,目的都是接收記憶體位址。
執行以下的程式,會發現居然印出的結果跟main()函式印出的&arr、arr完全不同。
1
2
3
4
5
6
7
8
9
10
void func1(int arr[]) {
printf("func1 &arr= %p \n", &arr);
printf("func1 arr= %p \n", arr);
}
int main() {
int arr[10];
printf("main address= %p \n", arr);
func1(arr);
return 0;
}
main address= 0x7ff7bfeff2c0
func1 &arr= 0x7ff7bfeff298
func1 arr= 0x7ff7bfeff2c0
這要回到函式的基本知識。
main()複製記憶體位址給func1()函式,func1()有一個區域變數int* arr
,arr是指標類型,內容是儲存記憶體位址。
函式修改main()函式的區域變數
透過複製記憶體位址給func1,func1()可以修改main()空間中的arr區域變數。
以下程式,main()函式中的arr[0]修改成11。
1
2
3
4
5
6
7
8
9
10
11
void func1(int arr[]) {
arr[1]++;
}
int main() {
int arr[3] = {10, 20, 30};
func1(arr);
cout << "arr[0] = " << arr[0] << endl;
cout << "arr[1] = " << arr[1] << endl;
cout << "arr[2] = " << arr[2] << endl;
return 0;
}
arr[0] = 10
arr[1] = 21
arr[2] = 30
1
2
3
4
5
6
7
8
9
10
11
void func1(int* arr) {
arr[1]++;
}
int main() {
int arr[3] = {10, 20, 30};
func1(arr);
cout << "arr[0] = " << arr[0] << endl;
cout << "arr[1] = " << arr[1] << endl;
cout << "arr[2] = " << arr[2] << endl;
return 0;
}
arr[0] = 10
arr[1] = 21
arr[2] = 30