C 指標的深度理解

2021-08-20 23:40:57 字數 2059 閱讀 1219

筆者會從各種的例子和面試題入手,將逐步去分析指標的知識點和指標的一些高階的用法。

第乙個例子,也許一些人會疑惑為什麼t是512了,先看下面的圖 

從筆者自己畫的圖分析,引用(&)這個符號返回的是這個型別最低位的位址而不是最高位數的位址,還有就是int型指標和char型的指標的區別到底在**?不同型別的指標唯一區別就是偏移量的不同,它們存的都是位址,但是char型指標偏移量是1個位元組,而int型指標的偏移量是4個位元組(void *的指標是只有位址 沒有偏移量),所以pchar+1就可以指向int型資料內部的第二個位元組位置的位址,這個訪問看出上去非法的,但是確實可行,因此t就是2的9次方得到512也不奇怪。這樣的指標可以說破壞了int型的結構,可以看出指標的靈活,如果沒有訪問許可權的問題,指標可以隨意修改任何程式的數值,指標也可以直接賦給它乙個位址,如下面的圖

可以看出指標非常強大,但是因為系統有訪問許可權的設定,就算知道另外乙個程式的數值的位址也難以修改,當然可以通過dll注入去修改其他程式的數值(這種方法筆者有時間會去詳細的介紹的),接下讓我們去看一下關於指標的一些簡單的面試題。

第乙個ptr指標指向是a往後偏移1個位元組的位址,然後將其強制轉換成int *,讓這個指標的偏移量是4個位元組。

第二個ptr指標指向是a往後偏移4個位元組的位址,因為先將(&a)轉換成int型指標了,所以之後的加1就是4個位元組的偏移量(sizeof(int))。

第三個ptr指標直接指向乙個(int)a+1的位址,筆者也不知道到底指向那裡了,這個和上述直接賦值乙個位址一樣的效果。

一維陣列名其實和指標常量基本沒有差別,唯一的區別就是指標常量自身佔據棧上的記憶體空間指向陣列的首位址,而一位陣列名本身的位址就是這個陣列的首位址(變數的別名和指標也有這個區別),並且它們的指向位址都不能改變,如下圖所示。

n級指標可以表示n維陣列,筆者接下來會用二級指標去表示二維陣列,表達一下二級指標的基礎知識點,希望一些不太了解指標的人可以舉一反三,去深入了解各種的n級指標,如圖所示。

從圖中可以知道二級指標向堆申請的空間不是連續的,二級指標p的偏移量是sizeof(int)*n(也就是一行為偏移量),一級指標*p的偏移量是sizeof(int),二級指標第一次解引用就會成為一級指標,一級指標解引用就是這個位址存的值,

既然談到了二級指標,接下來談一下int *p[n]和int (*p)[n]的區別,int *p[n]是陣列指標,也就是說p[0],p[1]..都是乙個指標,而int (*p)[n]是一級行指標,偏移量是sizeof(int)*n,這種指標只能訪問二維陣列的行的首位址,裡面的具體單位無法訪問,以此類推我們可以知道**指標的偏移量是整個二維陣列。

接下來筆者用指標去寫乙個轉移表,讓讀者們知道指標不僅可以指向任何資料型別也可以指向函式的首位址,下面就是轉移表**。

#includeusing namespace std;

double add(double ,double );

double sub(double ,double );

double mul(double ,double );

double div(double ,double );

int main(void)

; f=work[0](2.3,3.1);

cout

深度理解指標

首先,指標是什麼呢?我們看這樣一段 includeint main 知道了這些以後,讓我們再來看幾個有關指標的定義。指標陣列 指標陣列是陣列,是乙個存放指標的陣列。舉個栗子 int arr1 10 表示每個陣列元素是一級指標,int表示指標指示的型別是整型 char arr2 4 表示每個陣列元素是...

指標深度理解

指標陣列 乙個陣列,若其元素均為指標型別資料,稱為指標陣列。也就是說,指標陣列中每乙個元素都相當於乙個指標變數。其詳細形式應該如下 a 0 a n 每乙個陣列裡面儲存的是其指向的位址 一維指標陣列的定義形式為 型別名 陣列名 陣列長度 例如 int p 4 由於比 優先順序更高,因此p先與 4 結合...

C 指標的理解

1.記憶體長成啥樣?物理記憶體條由連續排列晶元組構成,在計算機中記憶體模型也被抽象為一組連續的儲存空間,每個空間都能夠儲存若干位元組的資料,每一塊儲存空間也有乙個特定的序號,從0到n。備註 為了便於理解,此處,將記憶體儲存空間橫向排列 實際橫縱排列的意義相同 0000 0001 0002 0003 ...