說到指標,就會出現一些複雜型別,如果對這些複雜型別不太了解,在用到指標有時就會比較懵。乙個型別裡面會有很多運算子,其優先順序和運算優先順序一樣,只需要遵循乙個原則:
從變數名處起,根據運算子優先順序結合,一步一步分析先來看看簡單的型別:
int p;
//這是乙個普通的整型變數
int*p;
//先從p處開始,先於*結合,說明p是乙個指標,然後再與int結合,說明
//指標所指向的型別為int型。所以p是返回乙個整型資料的指標
int p[5]
;//先從p出開始,先於結合,說明p是乙個陣列,然後再與int結合,說明
//陣列裡面的元素是整型的,所以p是乙個由整型資料構成的陣列
int*p[5]
;//從變數名p處開始先與結合(因為優先順序比*號高),所以p是乙個陣列,
//再與*結合,說明陣列裡面的元素是指標型別,然後再與int結合,說明指標
//所指向的類容是整型,所以p是乙個由返回整型資料的指標所組成的陣列
int(
*p)[5]
;//先從p處開始,先於*結合("()"改變優先順序),說明p是乙個指標,然後再與結合,
//說明指標指向的是乙個陣列,再與int結合,說明陣列裡的元素是整型的,所以p是乙個
//指向由整型資料組成的陣列的指標
int*
*p;//先從p處開始,與*結合,說明p是乙個指標,然後再與*結合,說明指標指向的元素是指標,
//然後再與int結合,說明該指標指向的元素是整型資料
intp
(int);
//從p處起,先與()結合,說明p是乙個函式,然後進入()分析,說明函式有乙個整型變數的引數
//然後再與外面的int結合,說明函式的返回值是乙個整型資料
int(
*p)(
int)
;//從p處開始,先於指標結合,說明p是乙個指標,再與()結合,說明指標指向的是乙個函式,
//然後再與括號裡的int結合,說明函式有乙個int型的引數,再與最外面的int結合,說明
//函式返回型別是int型,所以p是乙個指向有乙個整型引數且返回型別為整型的函式的指標。
以上分析就是從變數名處開始,根據運算子優先順序,逐層分析,按照這個準則,基本不會錯。
一、細說指標
指標到底是什麼?它在c語言程式設計中到底起什麼樣的作用?這是需要知道的問題。
在c語言中,允許用乙個變數來存放指標,即稱為指標變數。乙個指標變數的值就是某個記憶體單元的位址或稱為某記憶體單元的指標。要搞清楚乙個指標,必須要弄明白以下四個方面的內容:
指標的型別
指標所指向的型別
指標所指向的記憶體區
指標本身所佔據的記憶體區
1.指標的型別
首先,先來看指標的型別,指標型別的判斷一般把指標宣告語句裡的指標名字去掉(也就是變數名),剩下的部分就是這個指標的型別。看如下例子:
int
* p;
//指標型別是int*
char
* p;
//指標型別是char*
int*
* p;
//指標型別是int**
int(
*p)[5]
;//指標型別是int(*)[3]
在這裡,為了更好的表示指標的型別,是將更靠近int,即:int p,其實這種寫法與int p,一樣,這裡為了更明顯的表示出型別,所以寫為int p;2.指標所指向的型別
指標所指向的型別就是把指標宣告語句裡的指標名字和指標宣告符去掉,剩下的就是指標所指向的型別。
int
*p;//指標所指向的型別就是int
int*
*p;//指標所指向的型別就是int*
char
*p;//指標所指向的型別就是char
int(
*p)[4]
;//指標所指向的型別就是int ()[4]
在指標的算術運算中,指標所指向的型別有很大的作用,指標的型別和指標所指向的型別也是兩個概念,也要區分開來。
3.指標所指向的記憶體區
指標所指向的記憶體區也就是指標的值,指標指向了某塊記憶體區域,該指標的值就是這塊記憶體區域的首位址。
4.指標本身所占用的記憶體區
在32位平台裡,指標本身所佔據的記憶體空間都為四個位元組。
sizeof
(指標的型別)
;//可以使用sizeof()來檢視,指標都是為四個位元組的長度
無論定義的指標返回的值是什麼型別,該指標都占用四個位元組的長度。
int
*p1;
char
*p2;
float
*p3;
int(
*p)[4]
;int
**p4;
printf
("%d\n"
,sizeof
(int*)
);printf
("%d\n"
,sizeof
(char*)
);printf
("%d\n"
,sizeof
(float*)
);printf
("%d\n"
,sizeof
(int(*
)[4]
));printf
("%d\n"
,sizeof
(int**
));最後的列印結果都為4;
c語言中認識指標
位址和變數的概念 指標作用 1 表示複雜的資料結果 eg 鍊錶 樹 2 能動態分配記憶體 3 方便的使用字串 4 有效而方便使用字串 5 有效而方便的使用陣列 呼叫函式的時候能夠獲得1 個以上的結果。6 能夠直接處理單元位址等 總結 可以看到可以很直接的接觸到計算機的硬體的內容進行操作。1 資料的儲...
帶你認識指標 C語言的靈魂(一)
最近複習考研的知識,有機會研究一下c語言的指標,今天就總結一下有時候讓我們愛的要死,有時候也恨得要死的指標,到底是什麼?書裡指標那章的序言說到了,不掌握指標就是沒有掌握c的精華,word指標看來真的有他的厲害之處啊。話不多說,開始總結。第一篇總結解決一下什麼是指標的問題,做了乙個小demo簡要說明指...
C語言認識(一)
a 和 a if語句 練習這裡陳述c語言的入門筆記 在目前學習中,可以從基礎書籍入手。作業系統 計算機的心智作業系統之哲學原理 計算機網路 謝希仁版的計算機網路 微機原理 清華大學出版的微機原理 資料結構 c語言屬於強型別語言,需要對變數先定義在賦值,一旦變數的型別確定那麼變數的型別將不在改變。1b...