天天看點

字元指針 指針數組 數組指針 函數指針辨析

在初次學習指針中,我們了解到以下内容:

指針就是一個變量,用來存放位址,位址唯一辨別一塊空間

指針的大小是固定4/8個位元組(32/64位平台)

指針是有類型的,指針的類型決定了指針的 +- 整數的步長和指針解引用操作的時候的權限(通路幾個位元組)。

指針的相關運算

注:本次主要讨論指針更進階的用法

一般使用:

字元指針 指針數組 數組指針 函數指針辨析

還有一種會使用方式:

字元指針 指針數組 數組指針 函數指針辨析

代碼 <code>char* pstr = "hello bit."</code>; 特别容易讓同學以為是把字元串 hello bit 放到字元指針 pstr 裡了,但是本質是把字元串 hello bit. 首字元的位址放到了pstr中

如圖所示:

字元指針 指針數組 數組指針 函數指針辨析

上面代碼的意思是把一個常量字元串的首字元 h 的位址存放到指針變量 pstr 中。

那可能會有這樣的問題:

字元指針 指針數組 數組指針 函數指針辨析

最終輸出結果為:

字元指針 指針數組 數組指針 函數指針辨析

這裡str3和str4指向的是同一個字元串常量.c/c++會把常量字元串的存儲到單獨的一個記憶體區域,當幾個指針指向同一個字元串的時候,他們實際會指向同一塊記憶體。但是用相同的常量字元串去初始化不同的數組的時候就會開辟出不同的記憶體塊。是以str1和str2不同,str3和str4不同。

例如:

注意:指針數組是一個數組,裡面存放的是一個一個的指針。

注意:數組指針是一個指針,指向的是一個數組

&amp;數組名 和 數組名

字元指針 指針數組 數組指針 函數指針辨析

通過以上代碼的驗證及結果可以發現:

&amp;arr和arr的值是一樣的

&amp;arr取出的是整個數組的位址,我們可以從它+1後的改變量看出

arr是數組首元素的位址,在這個題裡就是int*類型

數組的位址+1,跳過整個數組的大小,是以 &amp;arr+1 相對于 &amp;arr 的內插補點是40

首先看一段代碼

運作結果:

字元指針 指針數組 數組指針 函數指針辨析

輸出的是兩個位址,這兩個位址就是 test 函數的位址。

要儲存函數的位址,我們就引出了函數指針,例如存放test函數的位址的函數指針<code>void (*fptr)();</code>了解:fptr先和*結合,說明fptr是指針,指針指向的是一個函數,指向的函數無參數,傳回值類型為void。

聽其名便可知道隻是一個數祖,裡面存放的是一個個的函數指針,但是如何定義呢?

根據了解我們可以看到<code>int (*parr1[10]])();</code>是正确的,可以這樣了解:parr1 先和 [] 結合(因為[]結合性比優先級高),說明parr1是數組,數組的内容是什麼呢? 是 int ()() 類型的函數指針.這樣我們就定義了一個函數指針數組.

了解:指向函數指針數組的指針是一個 指針, 指針指向一個 數組 ,數組的元素都是 函數指針。這樣我們就可以定義出來了

看如下代碼:

我們就介紹到這裡,希望對小夥伴們的學習有所幫助,若本章節中有錯誤,希望大家及時提出,大家一起探讨。

繼續閱讀