筆記4 指標和陣列 函式結合分析

2021-08-14 07:45:46 字數 3247 閱讀 6191

一.指標陣列和陣列指標

分析指標陣列和陣列指標的表示式

int

*p[5]; int (*p)[5]; int

*(p[5]);

總結:我們在定義乙個符號時,關鍵在於:首先要搞清楚你定義的符號是誰(第一步:找核心);其次再來看誰跟核心最近、誰跟核心結合(第二步:找結合);以後繼續向外擴充套件(第三步:繼續向外結合直到整個符號完)。

例如:核心是指標,就表示該結合是什麼什麼的指標。

如果核心和*結合,表示核心是指標;如果核心和[ ]結合,表示核心是陣列;如果核心和()結合,表示核心是函式

記住以下符號優先順序即可([ ] . ->),優先順序都是高的

int

*p[5]; //p是乙個陣列,陣列有5個元素,陣列元素都是指標,指標指向的元素型別是int型別的;整個符號是乙個指標陣列

int (*p)[5]; //核心是p,p是乙個指標,指標指向乙個陣列,陣列有5個元素,陣列中存的元素是int型;總結下整個符號的意義就是陣列指標。

1.優先順序和結合性是分析符號意義的關鍵

2.學會逐層剝離的分析方法

找到核心後從內到外逐層的進行結合,結合之後可以把已經結合的部分當成乙個整體,再去和整體外面的繼續進行結合。

二.函式指標與typedef

1. 1.1函式指標的實質還是指標,還是指標變數。本身佔4位元組(32位系統中,所有的指標都是4位元組)

1.2 函式指標、陣列指標、普通指標之間並沒有本質區別,區別在於指標指向的東西是什麼

1.3 函式的實質是一段**,這一段**在記憶體中是連續分布的(乙個函式的大括號括起來的所有語句將來編譯出來生成的可執行程式是連續的),所以對於函式來說很關鍵的就是函式中的第一句**的位址,這個位址就是所謂的函式位址,在c語言中用函式名這個符號來表示。

1.4結合函式的實質,函式指標其實就是個普通變數,這個普通變數的型別是函式指標變數型別,它的值就是某個函式的位址(也就是它的函式名這個符號在編譯器中對應的值)

2. 2.1函式指標的書寫和分析方法

假設我們有個函式是:void func(void);

對應的函式指標:void (*p)(void);

型別是:void(*)(void);

如果核心和*結合,表示核心是指標;然後指標和()結合,表示是函式指標

函式名和陣列名最大的區別就是:函式名做右值時加不加&效果和意義都是一樣的;但是陣列名做右值時加不加&意義就不一樣

。3.typedef

3.1

一般用於使用者自定義型別,如陣列指標、指標陣列、函式指標等都屬於使用者自定義型別

typedef一般給型別重新命名,也就是說typedef加工出來的都是型別,而不是變數 如:

typedef char* (*ptype)(char *,const char *);

//這句重新命名了一種型別,這個新型別名叫ptype,型別是:char* (*)(char *,const char *);

//函式指標陣列

typedef char* (*ptype[5])(char *,const char *);

//函式指標陣列指標

typedef char* (*(*ptype)[5])(char *,const char *);

總結:函式指標分析方法也是源於優先順序和逐層剝離的基本理論,同上

3.2

typedef和const

typedef int *p; const p p2; 相當於是int *const p2;

typedef int *p; p const p2; 相當於是int *const p2;

3.3

typedef和#define

typedef char *pstr1;

#define pstr2 char *;

pstr1 s1, s2;

pstr2 s3, s4;

在上述的變數定義中,s1、s2、s3都被定義為char *,而s4則定義成了char,不是我們

所預期的指標變數,根本原因就在於

define只是簡單的字串替換而typedef則是為乙個型別起新名字

4. 結構體內嵌函式指標實現**分層,核心基本使用該方式實現

4.1

分層後上層為下層提供服務,上層寫的**主要是為了在下層中被呼叫

4.2

上層注重業務邏輯,與我們最終的目標相直接關聯,而沒有具體幹活的函式

4.3

下層**中的核心是乙個結構體變數,寫下層**的邏輯其實很簡單。第一步先定義結構體變數;第二步填充結構體變數;第三步呼叫上層寫好的介面函式,把結構體變數傳給它即可。

三.二維陣列的運算和指標(配圖)

3.1指標指向二維陣列的陣列名

3.1.1 二維陣列的陣列名表示二維陣列的第一維陣列中首元素(也就是第二維的陣列)的首位址

3.1.2 二維陣列的陣列名a等同於&a[0],這個和一維陣列的符號含義是相符的

3.1.3 用陣列指標來指向二維陣列的陣列名是型別匹配的

a[i][j] = *(*(p+i)+j)
int a[2][5];

int (*p3)[5]; //陣列指標,指向乙個陣列,陣列有5個int型元素,

p3 = a; //a是二維陣列的陣列名,作為右值表示二維陣列第一維的陣列的首元素首位址,等同於&a[0]

p3 = &a[0];

printf("a[0][3] = %d\n",*(*(p3+0)+3));

printf("a[1][4] = %d\n",*(*(p3+1)+4));

3.2指標指向二維陣列的第一維

3.2.1 用 int *p來指向二維陣列的第一維a[i]

int *p4 = a[0]; //a[0]表示二維陣列的第一維的第乙個元素,相當於是第二維的整體陣列的陣列名。陣列名又表示陣列首元素的首位址,因此a[0]等同於&a[0][0]

int *p5 = &a[0][0];

3.3指標指向二維陣列的第二維

二維陣列的第二維元素其實就是普通變數了,已經不能用指標型別匹配了

1.陣列中各個符號的含義

2.陣列的指標式訪問,尤其是二維陣列的指標式訪問

5 3指標和陣列

定義乙個大小為10的陣列a 10 int a 10 包含了a 0 a 1 a 9 共計10個元素 定義指標 int pa pa指向陣列a的第0個元素,即pa為a 0 的位址。pa a 0 對陣列元素a i 的引用也可以寫為 a i 這樣的形式,這一點至少初看起來很令人吃驚。在求陣列元素a i 的值時...

(17)指標和陣列

在c 語言中,指標和陣列有非常緊密的聯絡,使用陣列的時候編譯器一般會把它轉換成指標。對陣列的元素使用取位址符就能得到指向該元素的指標。陣列有乙個特性 在多數用到陣列名字的地方,編譯器都會自動的將其替換為乙個指向陣列首元素的指標。當使用陣列作為乙個auto變數的初始值時,推斷得到的型別是指標而非陣列。...

12 指標和陣列

指標和陣列 不是陣列的專屬 注意 其實陣列就是指標,指標也是陣列 陣列名 include intmain 指向陣列首元素的指標 include intmain int argc,char argv int p null p指標變數指向首元素 p a 0 p a int i 0 for i 0 i 1...