一言以蔽之: 指針能間接的訪問變量的內存,進行讀和寫的操作。
定義指針
數據類型 * 指針變量名
int a = 0;
int * p; //定義指針
p = &a; //指針記錄變量a的地址
使用指針
可以通過解引用的方式來找到指針指向的內容
指針前加 * 代表解引用,找到指針指向的內存中的數據
*p = 1000; //這段代碼會把 a 變量裏的值也修改
cout << *p << endl;//訪問a的數據
指針所佔內存空間
32位操作系統:佔4個字節空間
64位操作系統:佔8個字節空間
cout << sizeof(int *) << endl;
空指針和野指針
空指針和野指針都不是我們申請的空間,因此不能訪問
空指針
定義:指針變量指向內存中編號爲0的空間。
用途:初始化指針變量。
注意:空指針指向的內存是不可以訪問的。
0~255之間的內存編號是系統佔用的,因此不可訪問
int * p = NULL;
*p = 100;//空指針不可訪問, nullptr
野指針
定義:指針變量指向非法的內存空間
內存地址沒有申請是不可以訪問的!!!
int * p = (int *)0x1100;
cout << *p << endl;
const修飾指針
const修飾指針有三種情況:
1,const修飾指針——常量指針
2,const修飾常量——指針常量
3,const既修飾指針,又修飾常量
1,常量指針(const int * p = &a)
指針的指向可以修改,但是指針指向的值不可以修改
int a = 10;
int b = 20;
const int * p = &a;
*p = 20;//錯誤,指針的值不可以改
p = &b;//正確,指針指向可以改
2,指針常量(int * const p = &a)
值可以改,但是指向不可以改
int a = 10;
int b = 20;
const int * p = &a;
*p = 20;//正確,指針的值可以改
p = &b;//錯誤,指針的指向不可以改
3,const既修飾指針,又修飾常量
指針的指向和值都不可以修改
int a = 10;
int b = 20;
const int * p = &a;
*p = 20;//錯誤,指針的值不可以改
p = &b;//錯誤,指針的指向不可以改
指針和數組
指針在數組中利用+1可以進行偏移。
int arr[] = {1,2,3,4,5,6,7,8,9,10};
int * p = arr;
for (int i = 0; i<10; i++) {
cout << *p << endl;
*p++;
}
指針和函數
利用指針可以做地址傳遞
void swap(int * a,int * b){
int temp = *a;
int *a = *b;
int *b = temp;
}
int a = 10;
int b = 20;
swap(&a,&b);