1. 介紹
指針是一個值爲內存地址的變量
ptr = &var; //將變量var的地址賦給變量ptr,變量ptr就是指向變量var的指針
而對於ptr和&var來說,ptr是一個變量,&var則是一個常量,變量可以被賦值改變,而常量不可以
2. 獲取值
當得到一個指針時,就可以得到這個指針所在的值
var1 = *ptr //此時var1==var
符號*,叫間接運算符,也叫取值運算符,用於獲取指針所指向的地址中存儲的值
也就是說,
ptr = &var
和var1 = *ptr
與var1 = var
是等效的
3. 特點
- 變量的地址通常是變量首字節所在的地址
- 對指針加1,等價於對指針的值(指針的值,而不是指針所指向的變量)加上它所指向的對象的字節大小
4. 數組指針
1. 數組名是該數組首元素的地址
arr = &arr[0];
2. 鑑於特點中的第二點,所以對數組指針加1,指針就指向了數組的下一個元素
arr + 2 == &arr[2]; //true
&arr[0] + 2 == &arr[2]; //true
以上兩條語句是等效的
3. 訪問數組元素可以採用一下方式
arr[2] == *(arr + 2);
arr[0] == *arr;
arr[0] == *(&arr[0]);
4. 函數原型聲明(參數爲數組)
int sum(int *arr, int n);
int sum(int *, int);
int sum(int arr[], int n);
int sum(int [], int);
以上四種形式是等價的
5. 函數定義(參數爲數組)
int sum(int *arr, int n){
//code
}
int sum(int arr[], int n){
//code
}
以上兩種形式等價
5. 注意
- 不能對未初始化的指針進行取值或賦值
int *ptr;
*ptr = 5;
最好不要有以上行爲,由於ptr沒有被初始化,因此它的值(指針的值是地址,即地址是隨機的)是隨機的,不知道5會被存儲到什麼地方,可能無害,也可能會覆蓋程序的數據(指向了程序的某個變量的地址),導致程序錯誤甚至崩潰。
因此,在聲明一個指針的同時,最好將其初始化(指明該指針所指向的變量地址)
2. 若不希望函數改變數組,那麼就對函數的形參使用const
int sum(const [], int);
int sum(const int arr[], int n){
//code
}
由於數組通過參數的方式傳遞給函數進行操作的時候,傳遞的是數組的地址,因此函數對數組的操作會改變數組的內容。
使用const關鍵字,就是告訴編譯器,函數應當把arr所指向的數組作爲包含常量數據的數組對待
==注意:==
這樣使用const並不代表原始數組是固定不變的,這只是說明函數在處理數組時,應該把數組當作固定不變的