1、基礎概念
在 c 語言裡,基本變量存放的是資料,而指針變量是存放位址的變量(另一變量額位址)。在 c 語言中,指針也稱之為位址,是以我們常說某某變量的指針,可以了解為某某變量的在記憶體中的位址。如:b 變量的指針是 1000,可以了解為 b 在記憶體中的位址是 1000,注意不能了解為 b 的指針變量是4004(錯誤的了解)。
2、定義指針變量
在 c 語言指針的定義形式如下:
類型說明符 *指針變量名
如:
在 c 裡,可以在變量前加 & 符号取得變量的位址,同樣地,可以在指針變量前加 * 符号取得指針變量指向的變量的值(該記憶體位址上存放的資料),如:
3、指針變量作為函數參數
注:在被調用函數中,試圖修改指針變量的值(即位址)來達到改變實參的目的都是錯誤的.
這句話如何了解呢?這裡牽涉到一個比較容易混淆的問題-值傳遞和引用傳遞的差別.在這裡提供一種了解方式,如下:将實參傳給形參的時候,形參都是将實參的内容複制一遍,再調用相對應的函數.
另外,我們還需要了解一下,下面這幾個的定義方式的不同:
5、一維數組和指針
數組與指針,是一個比較容易讓人迷惑的地方,最主要就是各種不同的表示方式所代表的不同的含義,下面我們一步步來了解一下不同的方式:
1) 定義方式:
2) 通過指針引用數組元素
類似地推算,我們可以知道:a[i] 等同于 *(a+i),當中 a[0] 等同于 *a 或 *(a+0);*(p+i) 等同于 ptr[i]。看過一些書,會有着這樣一種介紹 * 和 [] 等同,,結合前面的例子,我們再看另外一個例子:
是不是覺得我們基本可以了解這些使用了,我們再深入地學習一下,當 * 與 ++ 或 —— 相遇時,又會是一種什麼樣的情況:
* 與 ++ 或 -- 的運算符優先級相同,結合性是由右往左。如果覺得基本都懂的,那猜猜一下下面這個例子會輸出什麼?
現在的我們可以來總結一下:
當 p = &a[i] 時,則有: *p++ 相當于 a[i++]; *++p 相當于 a[++i]; *p-- 相當于 a[i--]; *—p 相當于 a[—i];
6、二維數組和指針
在前面,我們已經學過,一維數組的元素值,可以使用 [] 或 * 來擷取;類似地,在二維數組裡,我們可以使用 ** 、[][] 或 一個 * 與一個 [] 獲得,其餘的表示法(即一個 * 或 一個 [])隻能得到位址。介紹如下:
在二維數組a裡,可以這樣取得第 i 行,第 j 列的位址:
&a[i][j] , a[i]+j,*(a+i)+j
對應的,我們隻需要在位址前加一個 * 即可得到其對應的值:
a[i][j],*(a[i]+j),*(*(a+i)+j)
那現在我們思考一下,應該使用什麼樣的指針指向二維數組呢??
指向數組的指針 (*p)[] 指向二維數組了。介紹如下:
http://blog.51cto.com/peiquan/1556224