指標是乙個變數,所不同的是,它存的是位址。
因為資料型別決定著如何解釋這個位址(位元組數和操作),因此根據的資料型別的不同,指標又有不同的型別。
某個物件(a)的位址範圍為:[&a, &a + size_n),其中size_n是a所佔的位元組數
比如乙個一維陣列int a[10],位址範圍為[&a, &a + 10*sizeof(int) )
對於不同的資料型別,操作是不同的,
如一維陣列指標和二維陣列指標: int a[3], b[4][3], *pa = a, (*pb)[3] = b;
對於 pa += 1 和 pb += 1
是不同的。前者會移動sizeof(int)個位元組,後者則會移動3*sizeof(int)個位元組,這就是資料型別決定操作,所以我想這應該就是設計不同型別的指標的主要原因了。
關於多維陣列的位址
眾所周知,一維陣列的元素位址是連在一起的,二維陣列是根據列優先排列的,也就是一行接一行排列。實際上,對於多維陣列,下標越靠右,下標變化得越快
乙個m維陣列a[
n1][
n2].
..[n
m]則有 a[
i1][
i2].
..[i
m]的地
址=a+
size
∗∑j=
1mij
∗∑k=
j+1m
nk其中size是元素的所佔位元組數
注意這裡的單位是位元組,因此不是並不能直接在c語言裡使用
例如int a[3][4];
&a[i][j] = a +sizeof(int) * i * 4 + sizeof(int) * j
正確的呼叫a[i][j]位址的c語法為 (int*)a + i * 4 + j
關於void型別指標
前面說過,陣列型別決定如何解釋這個位址,void並不是一種真正的型別。因此它不能直接使用,但它可以作為一種中間量,暫時儲存位址。真正使用的時候必須轉換。
它常常作為通用指標使用。在c標準庫裡面,有的函式引數正是這種,這樣就可以實現通用操作。
如:void *memcpy( void *to, const void *from, size_t count );
這裡的count是資料型別的所佔的位元組數,這樣可以實現任意的型別的複製操作
字串一般有兩種儲存方式,
(1) char str = ;
(2) char *str = 「123456789」;
第一種是使用字串陣列儲存,文字是存在str陣列裡的,
第二種則不同,str是乙個字元指標,因此它儲存的僅僅是這段文字存放的位置的首位址,這段文字是存在常量區的。
另外,還可以先申請一段空間(堆),使用malloc等,然後儲存文字,這樣也是也可以的,而且更靈活,相對的也更容易出錯。
關於makefile的一點思考
在gnu編譯工具軟體中,如果對單一的原始檔進行編譯,可執行指令如下 gcc o x x.c 此指令會將原始檔編譯為目標檔案。若是對執行緒類檔案進行編譯,則在末尾加上 lpthread指令。但若是對多檔案進行編譯,即若是編譯的目標檔案同時包含另一檔案中的函式。則在編譯的時候需將另一檔案加到編譯原始檔中...
關於演算法的一點思考。。。
關於演算法的一點思考。在實踐過程中,我發現 有時候要解決乙個問題,可以設計幾個演算法分步完成任務,這樣處理起來比較簡單,但是情況並非總是如此,有時,我們需要將幾個步驟放在同乙個演算法內連帶處理,這樣才比較容易處理問題。我還發現,有時候,解決問題的演算法,是被發現出來的,並加以一步一步的檢驗才得以確定...
關於Toleft的一點思考
先看下面的圖 任給乙個三角形,當你從某個頂點沿著三角形逆時針運動時,你會發現三角形內部的點始終在你的左手邊。所以這就給了我們啟示 如果能判斷乙個點在三條有向線段的左邊,而且這三條有向線段構成乙個三角形 首尾相接 那麼這個點就在這個三角形內。所以現在的問題是如何快速判斷乙個點在直線的左邊還是右邊。學過...