學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 變數 變數名以字母或下劃線開頭,長度無限制,內容...