天天看點

c 語言指針的相關概念

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

繼續閱讀