二、指標和函式
總結c語言中的指標一直是我最怵的地方,它有很多種用法,總是讓人搞不清楚。其實只要我們用正常的方式使用指標,它就沒那麼難以理解。我認為理清指標含義的好方式是將其和陣列進行比較,理解它和陣列在使用時的關係。
笨辦法學c
指標的基本概念:
指標是指向了計算機中的某個位址,這個位址裡存放著乙個特定型別的資料。指標本身的值就是乙個位址值,它指向的這個位址中的內容才是資料。
指標的通常用法:
type *ptr
定義乙個type型別的指標,名為ptr。這個type型別其實是指標指向的資料的型別,而指標本身是位址值。
*ptr
取值操作,表示ptr所指向位址中存放的值。
*(ptr + i)
表示(ptr所指向位置加上i)的值。
注意:以位元組為單位的話,應該是ptr所指向的位置再加上sizeof(type) * i。所以初始化的時候type很關鍵,它決定著指標向下移一位時,究竟是移動了幾個位元組的位址。
&thing
取址操作,表示thing存放的位址。
type *ptr = &thing
名為ptr,type型別的指標,值設定為thing的位址。
ptr++
自增ptr指向的位置。
我們先來看一段程式,它的用途就是輸出人名及對應的年齡。但在列印的時候,我們採用三種不同的方式,並且這些方式的輸出都是相同的。
#include
intmain
(int argc,
char
*ar**)
;char
*names=
;// safely get the size of ages
int count =
sizeof
(ages)
/sizeof
(int);
int i =0;
// first way using indexing
for(i =
0; i < count; i++
)printf
("---\n");
// setup the pointers to the start of the arrays
int*cur_age = ages;
char
**cur_name = names;
// second way using pointers
for(i =
0; i < count; i++
)printf
("---\n");
// third way, pointers are just arrays
for(i =
0; i < count; i++
)printf
("---\n");
return0;
}
首先定義了兩個陣列,ages:由int型元素構成的陣列;names:由char * 型元素構成的陣列。其中char *型別就是指字串,這個我們下面再說。
程式中元素順序列印時使用了四種index方法:
方式一:直接使用陣列下標索引,即ages[i],names[j]。
方式二:從這裡開始,我們使用指標幫助索引。先初始化兩個指標:
int
*cur_age = ages;
char
**cur_name = names;
第一句**的含義:int * 指「指向整數型別的指標」型別,也是一種資料型別。我們構建乙個這樣資料型別的變數 cur_age,並給它賦值為ages,ages是乙個整數陣列的名稱。
第二句**同第一句,初始化了乙個「指向char * 型別的指標」,命名為cur_name,把names賦值給它。names是乙個字串陣列的名稱。
for
(i =
0; i < count; i++
)
看到這種取值方式,我們就可以理解了。指標cur_name一開始的位址是指向陣列names的第乙個元素的,不停地加一,就會使位址不停向下移動,可以遍歷整個陣列。
這時,我們可能有個疑問,我們明明是把乙個陣列賦給了cur_name,為什麼它卻獲得的是乙個該陣列首元素的位址呢?
這就要理解陣列的名稱names代表什麼了。其實在c語言中陣列的名稱就會被推導成這個陣列的首元素位址,之後才能用下標索引來索引陣列中的元素。它的下標i就代表了從首元素向後移動i個單位。
這樣一聽,就會覺得乙個陣列的名稱也是乙個指向這個陣列首元素的指標啊。我感覺從實際效果來看是這樣的。
因此我們可以有方式三來索引這個陣列,這時就會發現,對指標和陣列名稱的索引操作是一樣的。
for
(i =
0; i < count; i++
)printf
("\n");
free
(sorted)
;}
這樣,我們在呼叫程式中的test_sorting時,就需要給它傳入符合compare_cb型別的函式了。
把指標和陣列相對應,就會發現它沒那麼複雜,一般也確實是這樣使用的。* 的數量越多,指標或陣列的巢狀就越多,我們應盡量避免這樣的複雜用法。
當然,指標還可以指向結構體,這個用法就會直觀很多。這次就記錄到這裡,有新的感悟再寫吧~如有錯誤,請大家一定指正!
C語言學習筆記(四) 指標
c語言學習筆記 四 指標 include intmain p就是乙個指標,p就是取出p指向位址的值 陣列 相同型別的資料集合 include intmain 在這個程式中,p是乙個指標,a是乙個陣列,若p a 0 或者p a就是p指向陣列的第乙個元素,接下來就可以對p進行 1或 1進行偏移操作 in...
C語言學習(三) 指標
指標的定義int p char p float p指標變數所佔記憶體的大小 跟前面定義的型別無關 而跟系統有關 16bits作業系統 2b 32bits作業系統 4b 64bits作業系統 8b 指標指向乙個值所在的第乙個位元組 通常乙個位址存放乙個位元組 const修飾指標 指標指向乙個字串時 如...
C語言學習4 指標
int a 10 int p a 一級指標 int s p 二級指標 int p 10 指向陣列的指標 int s 10 指標指向放指標的陣列 這個陣列有十個空間 int p 10 開闢10個空間 每個空間放指標 例如 int br 10 int s 10 br int ar 10 int p 10...