1. 程式人生 > 其它 >指標陣列和陣列指標學習筆記1

指標陣列和陣列指標學習筆記1

技術標籤:筆記c語言指標

指標陣列和陣列指標學習筆記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],所以 (

(p+1)-6) == array[11 - 6] = array[5]

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、還有關於字元陣列的越界訪問的問題