小豬的C語言快速入門系列(五)

coder-pig發表於2017-10-16

小豬的C語言快速入門系列(五)

標籤: C語言


本節引言

上一節我們C語言 複合資料型別 中的 陣列 進行了解讀,本節我們會繼續來學習
複合資料型別中的 指標,指標可是C語言的靈魂;利用指標可以表示與使用複雜的
資料結構,讓我們可以更加方便的使用陣列與字串;可以像彙編一樣直接處理記憶體
單元地址;可以動態地進行記憶體空間分配;指標是C語言的重點,也是難點。


本節學習路線圖


指標概念,指標與一維陣列和字串


指標與二維陣列

這個知識點是指標裡的難點,要弄懂這裡的話,我們要先把重心放到二維陣列上,先
徹底瞭解清楚二維陣列!

  • Step 1:二維陣列是 按行與列儲存資料的,可以看成 若干行 + 每行若干列一維陣列組成;
    比如:int a3 = {{1,2,3,4},{1,2,3,4},{1,2,3,4}}; 可以看成三行,每行有四個一維陣列;

  • Step 2a 代表二維陣列 首元素的地址 ,即 &a[0],如果換成陣列的第二,三行的話,
    只需要把 a + 1a + 2這樣,等價於&a1&a2

  • Step 3:我們可以把 a[0] 看做是指向 a[0][0] 的指標,那麼 a[0]+1 即指向 a[0][1]
    即此時地址為:&a[0][1]

    PS:這裡的+1的1是陣列元素所佔的位元組數,比如int a[]的話,那麼這個+1代表的就是往後
    移動4個位元組,指向下一個元素;如果是+2的話就是後移8個位元組,所以a[i][2] = a[i] + 2

  • Step 4:通過前面一維陣列的學習,知道了 a[i] 等價於 *(a+i),同樣的,擴充套件到
    二維陣列的情況,則有 a[i][j]*(a+i)+ja[i]+j 都是等價的,都是表示陣列元素
    a[i][j] 的地址,而求 a[i][j]的值,用*(a[i]+j)*(*(a+i)+j) 都是可以的

注意一點

*a 與 *(a+i) 都不代表任何具體的資料元素,所以當你引用他們的時候可能會引起錯誤!

如果上面的內容都捋清楚了,下面這幾個點一清二楚了:

  • 1.陣列首地址a[0]: a 不可以直接引用!!!
  • 2.一維陣列a[0]首元的地址(&a[0][0]): a[0],*(a+0),*a;
  • 3.第一行的首地址: a + 1 同樣不可以直接應用
  • 4.一維陣列a1首元的地址(&a[1][4]): a[1],*(a + 1)
  • 5.序號為2行4列元素a[2][5]的地址:a[2]+4,*(a+2)+4,a[2][6]

使用程式碼示例

示例1指向陣列元素

#include <stdio.h>
int main()
{
    int a[2][2] = {{1,2},{3,4}};
    int *p,i,j;
    p = a[0];
    //p = &a[0][0]或*a也可以
    printf("輸出陣列中所有的元素:\n");
    for(i = 0;i < 2; i++) 
    {
        for(j = 0;j < 2;j++) 
        {
            printf("%4d",*p);
            p++;
        }
        printf("\n");
    }
    return 0;
}

輸出結果

示例2指向陣列

#include <stdio.h>
int main()
{
    int i,j;
    int a[4][9];
    //定義一個行指標,並指向陣列的首地址
    int (*p)[4];
    p = &a[0];
    printf("請輸入二維陣列中的陣列元素:\n");
    for(i = 0;i < 4;i++) 
    {
        for(j = 0;j < 4;j++)
        {
            scanf("%d",p[i]+j);
        }
    }
    printf("輸出二維陣列中的資料:\n");
    for(i = 0;i < 4;i++) 
    {
        for(j = 0;j < 4;j++)
        {
            printf("%4d",*(p[i]+j));
        }
        printf("\n");
    }
    return 0;
}

輸出結果


本文連結小豬的C語言快速入門系列(五)
作者:Coder-Pig
出處http://blog.csdn.net/coder_pig
本文基於知識共享署名-相同方式共享 4.0 國際許可協議釋出,歡迎轉載,
演繹或用於商業目的,但是必須保留本文的署名及連結。

相關文章