指標陣列和陣列指標學習筆記1
指標陣列和陣列指標學習筆記1
這個知識點感到了一些壓力;反覆看了好幾遍視訊。才稍微理解一點。然後在做課後練習時也遇到了一些難點,所以在此以記錄下來。
一、區分指標陣列和陣列指標
區分還是比較簡單的
(*p)[5] *p[5]
通過看p指標與其先結合的是什麼;像上面的。第一個*和p被括號括起來,即先結合。說明p是一個指標,指向的是一個數組。同理,第二個先和[ ]結合。p先被宣告為了一個數組。( [ ] 優先順序高於 * )
二、指標指向陣列的地址
其實就是將陣列看作一個整體,指標指向的是他們整體的地址。(雖然&array的值等於array,但是是沒有關係的)
判斷下面程式碼列印的值是多少:
#include <stdio.h>
int main()
{
int array[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
int (*p)[10] = &array;
printf("%d\n", *(*(p+1)-6));
return 0;
}
對於這行程式碼小甲魚的解釋是這樣的:
答:4
解析:基本上一道題成功理解的話,這道題就不會有什麼問題。指標 p 指向陣列 array 的地址,p + 1 便是指向整個陣列最後的位置(第二個 array 陣列的起始位置),於是 *(p+1) 即下一個陣列 array 陣列的起始位置,即 &array[11],所以 (
PS:如果我把列印的程式碼寫成這樣 printf("%d\n", (*(p + 1))[-6]); 現在你應該也可以理解了吧
但是其中我還是有不能理解的地方:為什麼要用陣列指標來存放&array呢…
三、main函式
還學習了一些關於main()函式引數的知識,在這裡我就複製貼上了
(來自:bbs.fishc.com)
實際上,main 函式是可以帶引數的,這個引數可以認為是 main 函式的形參(形式引數)。C 語言規定 main 函式的引數只能有兩個,習慣上把這兩個引數寫為 argc 和 argv
C 語言還規定C語言還規定了argc(第一個形參)必須是整型變數,argv(第二個形參)必須是指向字元指標的指標(注意:它不是指標陣列,但你可以理解為指向一個字元指標陣列名或字串陣列,在函式章節我們將詳細講解,這裡只要求你能夠根據案例模仿實現即可)
因此,main 函式可以寫成下邊這樣:版權屬於:bbs.fishc.com
int main (int argc,char *argv[])
{
……
我們知道 main 函式是由系統進行呼叫的(我們自己無法呼叫它),那麼如何給它傳遞引數呢
其實我覺得你們應該猜到了,main 函式的引數是從命令列上接收的
舉個例子大家就明白了,看程式碼:來自:bbs.fishc.com
#include <stdio.h>
int main(int argc, char *argv[])
{
int i;
for (i = 0; i < argc; i++)
{
printf("%s\n", argv[i]);
}
return 0;
}
四、典型習題
#include <stdio.h>
int main()
{
char *array[5] = {"FishC", "Five", "Star", "Good", "WoW"};
char *(*p)[5] = &array;
int i, j;
for (i = 0; i < 5; i++)
{
for (j = 0; (*p)[i][j] != '\0'; j++)
{
printf("%c ", (*p)[i][j]);
}
printf("\n");
}
return 0;
}
執行結果圖:
剛開始對指標數值和陣列指標還不夠熟悉,一直沒寫出來。一看答案,都驚了!char *(*p)[5] = &array ;
看起來好嚇人。其實仔細看其實就是指向 char * 型別的指標陣列。
接下來理解比較費工夫的地方就是 (*p)[i][j] 的意思。這其實就是下標法的表示,換成指標法表示就是 *( * (*p + i) + j)
總結
這一節的學習只能算勉強,之後還要回顧這篇筆記。
其實編寫程式碼的過程中還遇到其他的一些問題
類如:1、關於報錯“段錯誤(已儲存)” 2、還有關於函式atoi–將字串型別轉換為整型(https://fishc.com.cn/thread-68742-1-1.html)。3、還有關於字元陣列的越界訪問的問題