指標 C語言之魂(1)

2021-09-28 16:30:18 字數 2390 閱讀 2682

根據自己的學習進度,本篇部落格將會對c語言的靈魂部分——指標做乙個初級的描述,以及一些基本細節的講解。歡迎閱讀指正。

指標(pointer)是程式語言中的乙個物件,利用位址,它的值直接指向(points to)存在電腦儲存器中另乙個地方的值。由於通過位址能找到所需的變數單元,可以說,位址指向該變數單元。因此,將位址形象化的稱為「指標」。意思是通過它能找到以它為位址的記憶體單元。注意,指標是乙個變數

在32位的機器上,位址是32個0或者1組成二進位制序列,那位址就得用4個位元組的空間來儲存,所以乙個指標變數的大小就應該是4個位元組。 如果在64位機器上,如果有64個位址線,那乙個指標變數的大小是8個位元組,才能存放乙個位址。

其實定義指標的型別跟平時定義變數的型別差不多,具體如下。

char

*pc =0;

int*pi =0;

short

*ps =0;

long

*pl =0;

float

*pf =0;

double

*pd =

0;

既然指標作為乙個變數,那麼一定能夠進行整數的加減。定義指標型別的意義在於此。那麼當指標加減整數的時候,它的結果到底是根據什麼來計算的呢?我們來看以下**。

int

main()

通過以上**發現,在c語言中指標加減整數是通過指標的型別做判斷的。指標的型別所占用幾個位元組,那麼每加1結果便多加1個型別位元組。例如int型在32位作業系統下占用4個位元組,那麼指標每加1,結果便加4。char型占用乙個位元組,同理。

而在指標減指標的時候,結果為倆個指標之間相差元素的個數。只有在兩個指標同時作用於同一塊記憶體時,才有意義。

並且,指標的型別還決定了,對指標解引用的時候有多大的許可權(能操作幾個位元組)。比如:char的指標解引用就只能訪問乙個位元組,而 int 的指標的解引用就能訪問四個位元組。

既然指標是個存放位址的變數,那麼指標的位址又在**呢?

答案非常簡單,我們通過**來看。

int main()

以上**中,存放指標p的位址的變數p1就是二級指標,它指向p。

在初步學習指標之後,還有乙個重要的概念——大端與小端便可以開始摸索了。要了解這個,首先得明白什麼是大端,什麼是小端。

大端就是「低位址存放高資料」。而小端與之相反「低位址存放高資料」。

那什麼又叫做低位址呢?低位址即為首先訪問到的位址,低資料即為排序靠後的資料,這麼說有點摸不清頭腦,通過**來理解。

int

main()

else

return

0;}

由於n的位址為0x12345678,而強轉為char*型別之後職能讀取乙個位元組,即兩個數字,如果訪問到了低資料78,那麼可判斷為小端,反之則為大端。

我們所使用的手機一般是大端,而電腦一般是小端

在陣列裡使用指標是指標應用的重要部分之一。首先來說乙個最基本的。請看以下**。

int

main()

;printf

("%p\n"

, arr)

;printf

("%p\n"

,&arr[0]

);return0;

}

執行**,會發現列印的兩個值一模一樣。這串**的目的在於證明乙個重要的結論::陣列名表示的是陣列首元素的位址。於是當我們以後想要訪問乙個陣列首元素的位址的時候,可以直接用整個陣列名代替。順便說以下列印位址要使用上文中的%p哦。

現在我們可以直接通過指標訪問陣列了。

int

main()

;int

*p = arr;

int sz =

sizeof

(arr)

/sizeof

(arr[0]

);int i =0;

for(i =

0; i)return0;

}

像這樣通過在每次迴圈裡解引用陣列首元素的位址慢慢向後加一,就可以實現用指標訪問陣列了。順帶一提,**中的sizeof求陣列長度的方法非常好用而且通用哈。

C語言之指標 1

第一次寫部落格,若有不當之處,請指出,謝謝。最近忙於面試,對於指標有一點新的認識,寫下感悟與大家分享。面試題目,將0x04030201變成0x01020304,剛開始沒有多想,之前寫過暫存器,就想了乙個蠢方法。通過按位與將0x04030201中的4個位元組拆成0x04,0x03,0x02,0x01,...

C語言之指標(1)

1.廣義上說,常說的 指標 包括指標變數和指標常量,它們統稱為指標,在大多說情況下,指標指指標變數,存放記憶體位址。2.指標變數的型別作用 某型別一級指標變數 該型別一級位址 某型別二級指標變數 該型別一級指標變數 n 1級指標變數 n級指標變數 int p a p中只存放了a首位元組位址,但是in...

C語言之指標

指標型別的本質分析 1 指標的本質 指標的本質 一種復合的資料型別。下面我將以下面幾個作為例子進行展開分析 a int p b int p c int parvalue 3 d int pfun 分析 所謂的資料型別就是具有某種資料特徵的東東,比如資料型別char,它的資料特徵就是它所佔據的記憶體為...