在 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字節數!