在 C++ 中,變量地址和指針變量是內存操作的核心概念。
1. 變量地址
- 每個變量在內存中都有一個存儲位置,這個位置用地址表示。
- 使用取地址運算符
&可獲取變量的地址。
int x = 42;
cout << &x; // 輸出 x 在內存中的地址(如 0x7ffd1234)
地址是一個十六進制數值,代表變量在內存中的“門牌號”。
2. 指針變量
- 指針是一個變量,專門用來存儲另一個變量的地址。
- 聲明語法:
類型 *指針名;
int x = 42;
int *p = &x; // p 是一個指針,存儲 x 的地址
- 通過指針訪問原變量的值,使用解引用運算符
*:
cout << *p; // 輸出 42,即 x 的值
*p = 100; // 修改 x 的值為 100
示例
後面示例代碼均在VS中寫,之前都是用的記事本。
void main() {
printf("int 類型所佔用的字節數:%d", sizeof(int));
printf("\ndouble 類型所佔用的字節數:%d", sizeof(double));
printf("\nfloat 類型所佔用的字節數:%d", sizeof(float));
printf("\nlong 類型所佔用的字節數:%d", sizeof(long));
printf("\nshort 類型所佔用的字節數:%d", sizeof(short));
printf("\nchar 類型所佔用的字節數:%d", sizeof(char));
}
int 類型所佔用的字節數:4
double 類型所佔用的字節數:8
float 類型所佔用的字節數:4
long 類型所佔用的字節數:4
short 類型所佔用的字節數:2
char 類型所佔用的字節數:1
指針變量和獲取地址的值
void main() {
int i = 100;
double d = 200.5;
printf("i 的值是:%d\n", i);
// 通過 * 和 & 獲取變量的值
printf("i 的值是:%d\n", *(&i));
// 指針變量 指針存放的就是變量的地址
int* p = &i; // 定義一個指針變量 p
// double* pd = &d;
printf("p 指向的地址的值是:%d\n", *p);
}
i 的值是:100
i 的值是:100
p 指向的地址的值是:100
通過指針修改變量的值
void main() {
int i = 100;
int* p = &i; // 定義一個指針變量 p
printf("修改前 i 的值是:%d\n", i);
*p = 200; // 通過指針修改變量的值
printf("修改後 i 的值是:%d\n", i);
}
修改前 i 的值是:100
修改後 i 的值是:200
指針的運算
void main() {
int arr[] = { 10,20,30,40,50 };
// 指針指向數組的第一個元素
int* p = arr; // 等價於 int* p = &arr[0];
printf("數組的第一個元素是:%d\n", *p); // 10
// 指針運算
p++; // 指針向後移動一個元素
printf("數組的第二個元素是:%d\n", *p); // 20
p++; // 指針向後移動一個元素
printf("數組的第三個元素是:%d\n", *p); // 30
p--; // 指針向前移動一個元素
printf("數組的第二個元素是:%d\n", *p); // 20
// 通過指針遍歷數組
printf("通過指針遍歷數組元素:\n");
for (int i = 0; i < 5; i++) {
printf("%d ", *(arr + i)); // 等價於 arr[i]
}
}
數組的第一個元素是:10
數組的第二個元素是:20
數組的第三個元素是:30
數組的第二個元素是:20
通過指針遍歷數組元素:
10 20 30 40 50
傳值調用
void change(int i) {
i = 200;
}
void main() {
int i = 100;
printf("修改前 i 的值是:%d\n", i);
change(i); // 傳值調用
printf("修改後 i 的值是:%d\n", i);
}
修改前 i 的值是:100
修改後 i 的值是:100
通過地址來修改變量的值
void change(int* p) {
*p = 200;
printf("函數內部 p 指向的地址是:%p\n", p);
}
void main() {
int i = 100;
printf("修改前 i 的值是:%d\n", i);
change(&i); // 傳值調用
printf("i的地址是:%p\n", &i);
printf("修改後 i 的值是:%d\n", i);
}
修改前 i 的值是:100
函數內部 p 指向的地址是:000000B8006FF908
i的地址是:000000B8006FF908
修改後 i 的值是:200
注意:獲取int值使用的是
%d佔位,獲取指針的值是%p,如果操作系統是64位的話,地址的值就是64位,8字節數!