C——指針總結

1. 介紹

指針是一個值爲內存地址的變量

ptr = &var;   //將變量var的地址賦給變量ptr,變量ptr就是指向變量var的指針

而對於ptr和&var來說,ptr是一個變量,&var則是一個常量,變量可以被賦值改變,而常量不可以

2. 獲取值

當得到一個指針時,就可以得到這個指針所在的值

var1 = *ptr  //此時var1==var

符號*,叫間接運算符,也叫取值運算符,用於獲取指針所指向的地址中存儲的值

也就是說,ptr = &varvar1 = *ptrvar1 = var是等效的

3. 特點

  1. 變量的地址通常是變量首字節所在的地址
  2. 對指針加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. 注意

  1. 不能對未初始化的指針進行取值或賦值
int *ptr;
*ptr = 5;

最好不要有以上行爲,由於ptr沒有被初始化,因此它的值(指針的值是地址,即地址是隨機的)是隨機的,不知道5會被存儲到什麼地方,可能無害,也可能會覆蓋程序的數據(指向了程序的某個變量的地址),導致程序錯誤甚至崩潰。

因此,在聲明一個指針的同時,最好將其初始化(指明該指針所指向的變量地址)

2.  若不希望函數改變數組,那麼就對函數的形參使用const
int sum(const [], int);

int sum(const int arr[], int n){
    //code
}

由於數組通過參數的方式傳遞給函數進行操作的時候,傳遞的是數組的地址,因此函數對數組的操作會改變數組的內容。

使用const關鍵字,就是告訴編譯器,函數應當把arr所指向的數組作爲包含常量數據的數組對待

==注意:==
這樣使用const並不代表原始數組是固定不變的,這只是說明函數在處理數組時,應該把數組當作固定不變的

發佈了73 篇原創文章 · 獲贊 22 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章