指派基本型態與指派指標
指派基本型態 pass by value
基本型態(int, short, byte, long, long long, char)變數指派,都是passed by value,也就是把變數的「值」,複製到其它變數的記憶體位址的值中。
1
2
int i = 55;
int j = i; // 把i指派給j
基本型態修改值
把j變數的值,從55修改成40,不會影嚮變數i,因為i與j的記憶體空間是各別獨立,不會互相影嚮。
1
2
3
int i = 55;
int j = i; // 把i指派給j
j = 40;
指派指標 a pointer passed by value
指派給指標的值是「記憶體位址」,不是值,以下程式碼,變數p的值就是記憶體位址,所以可以指派給p2變數。
1
2
3
4
5
6
7
8
9
int main() {
int i = 55;
int* p = &i;
int* p2 = p;
cout << "i 位址 = " << &i << endl;
cout << "p 變數的值 = " << p << endl;
cout << "p2 變數的值 = " << p2 << endl;
return 0;
}
i 位址 = 0x00000008
p 變數的值 = 0x00000008
p2 變數的值 = 0x00000008
p是p變數的「值」。
把p變數的「值」,儲存在p2的記憶體位址中,p2的值也跟p的值一樣。
下圖中,p2變數也有自己的記憶體位址0x00000000E,但它儲存的是0x00000008。
指標修改值
指標修改值,會影嚮其它指標與原本的變數。
假如修改p2
*p2 = 100;
1
2
3
4
5
6
7
8
9
10
int main() {
int i = 55;
int* p = &i;
int* p2 = p;
* p2 = 100;
cout << "i = " << i << endl;
cout << "* p = " << * p << endl;
cout << "* p2 = " << * p2 << endl;
return 0;
}
i = 100
* p = 100
* p2 = 100
結論
其實基本型態與指標的指派,都是複製記憶體位址的「值」,給另一個變數。
只是傳值,是基本型態的值的複製,修改不會影嚮其它變數。
傳記憶體位址,是記憶體位址的複製,修改會影嚮其它變數。