C語言學習記錄(四) 指標!不要怕它!

2021-10-25 02:32:54 字數 2765 閱讀 1510

二、指標和函式

總結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...