入門視角 各類指標學習指南

2021-10-03 06:25:14 字數 3973 閱讀 2248

學c的路上,新手肯定會碰到「指標」這個頭疼的東西,我也一樣,一邊看書,一邊上網查資料,也還懵懵懂懂的。

我把關於對「函式指標」「指標函式」「陣列指標」「指標陣列」「指向指標的指標」這五種型別的理解寫下來(可怕的是還有好多其他型別的指標誒。。。)免得自己忘記,以後可複習使用。

可以給新手作參考,不過要先學習指標和陣列相關知識。根據我的學習程序,可能會持續更新。

一、指標函式

定義:是乙個返回指標的函式,其本質是乙個函式,而該函式的返回值是乙個指標。

宣告格式:*型別識別符號 函式名(參數列)

例如:int *strcpy(char *s1,char *s2);//將s2指向的字串複製到s1中

int

*strcpy

(char

*s1,

char

*s2)

return tmp;

}

注意:在呼叫指標函式時,需要乙個同型別的指標來接收其函式的返回值(如**中的*tmp)。

int

main

(void

)

pta例題:習題11-6 查詢子串查詢子串

pta例題:習題11-5 指定位置輸出字串

二、函式指標

定義:其本質是乙個指標變數,該指標指向這個函式。總結來說,函式指標就是指向函式的指標。

宣告格式:型別說明符 (*函式名) (引數)

例如int (*fun)(int x,int y);

int

add(

int x,

int y)

int(

*fun)

(int x,

int y)

;int

main

(void

)

呼叫函式指標的方式:result=(*fun)();

三、陣列指標

定義:陣列指標(也稱行指標),這種宣告表示它是乙個指標。

宣告格式int (*p)[n];

()優先順序高,首先說明p是乙個指標,指向乙個整型的一維陣列,這個一維陣列的長度是n。

例如

int

main

(void),

};int(

*p)[3]

;p=arr;

printf

("%d"

,*p[0]

);//結果輸出1

printf

("%d"

,*p[1]

);//結果輸出4

}

int

main

(void),

};int(

*p)[2]

;p=arr;

printf

("%d"

,*p[0]

);//結果輸出1

printf

("%d"

,*p[1]

);//結果輸出3

可以看出,這個一維陣列的長度定義不同2或3,也可以說是p的步長。執行時p[0]和p[1]時,p要跨過2或3個整型資料的長度。而導致輸出結果不同。

四、指標陣列

定義:指標陣列,其實質相當於宣告了乙個陣列,陣列內的每乙個元素均為乙個指標。

宣告格式int *p[n];

[ ]優先順序高,先與p結合成為乙個陣列,再由int*說明這是乙個整型指標陣列,它有n個指標型別的陣列元素。

例如

int

main

(void);

printf

("%s\n"

,month[0]

);}

int

main()

,,};

int*p[3]

=;//p[0],p[1],p[2]都是屬於指標p=;

printf

("%d\n%d\n%d\n%d\n",*

(*(p +1)

+3),

*(p[1]

+3),

(*(p+1))

[3],p[1]

[3])

;//輸出結果都為8

return0;

}

注意

我之前這樣寫在*p[3]中放入陣列,這是錯誤的,無法輸出結果,原因是指標要傳入位址,p[1]是乙個指標不能直接輸入1!

pta例題:習題11-1 輸出月份英文名

int

main()

,,};

int*p[3]

=;//int i=0;

//p=;

printf

("%d\n",*

(*(p +1)

+3))

;return0;

}

總之,陣列指標只是乙個指標變數,似乎是c語言裡專門用來指向二維陣列的,它占有記憶體中乙個指標的儲存空間。指標陣列是多個指標變數,以陣列形式存在記憶體當中,占有多個指標的儲存空間。

五、指向指標的指標

定義:如果乙個指標變數存放的又是另乙個指標變數的位址,則稱這個指標變數為指向指標的指標變數。

宣告格式char **p;

例如

int

main()

;int

*num[5]

=;//指標陣列存放陣列a位址

int*

*p,i,

**t;

p=num;

//陣列a的位址存放在指向指標的指標變數p的位址上

for(i=

0;i<

5;i++

)//**p要雙重解引用,才能讀取最上面的值

return0;

}

與二維陣列的對比↓結果都為1,3,5,7,9

int

main()

;int

*num2[5]

=;int*

*p,i,

**t;

t=num2;

for(i=

0;i<

5;i++

)return0;

}

對於什麼時候用「指標」還是「指向指標的指標」,要根據情況而定。

六、補充

多維陣列的表示

以二維陣列為例:

表示形式含義a

二維陣列名,指向a[0]

a[0], *(a+0), *a

0行0列元素位址

a+1, &a[1]

1行首位址

a[1], *(a+1)

a[1][0]的位址

a[1]+2, *(a+1)+2, &a[1][2]

a[1][2]的位址

*(a[1]+2), *( *(a+1)+2), a[1][2]

a[1][2]的值

文章二文章三

文章四

Python入門學習指南

python入門學習指南 對於初學者,入門至關重要,這關係到初學者是從入門到精通還是從入門到放棄。以下是結合python的學習經驗,整理出的一條學習路徑,主要有四個階段 no.1 新手入門階段,學習基礎知識 總體來講,找一本靠譜的書,由淺入深,邊看邊練。網上的學習教程有很多,多到不知道如何選擇。所有...

學習指南 學習指南 數學 從入門到精通

mathematics 數學 從入門到精通 來自學長學姐的錦囊妙計 2020.12.20 無 理科,數學一向是考試的重中之重 所謂語文不會,可以亂寫 英語不會,可以抄閱讀理解 數學不會,你真就只能寫個 解 為了讓大家不再為數學愁白了少年頭 兩位高考狀元隆重推出 數學 從入門到精通 你 值得擁有 蒙傑...

Shell指令碼學習指南 入門

關於指令碼第一行的 符號注意的幾點 不是必須存在,但存在比不存在好。最好跟上全路徑,長度不易太長最好不要超過64個字元。shell的基本元素 命令與引數 三種基本命令 內建命令,shell函式,外部命令 如 usr bin,usr local bin 變數 變數名以字母或下劃線開頭,長度無限制,內容...