c語言入門到c++使用高手: c語言入門之指針(六)

第九章 指針

第六節 數組的指針和指向數組指針的指針變量-3

1. 回顧二維數組和多維數組的概念

  • a[3][4]二維數組

  • a[7][8][9], 三維數組, 排列方式a[0][0][0]…a[0][0][9], a[0][1][0]…最右側維度變化最快,最左側變化最慢

  • 多維數組以此類推…

2. 指向多維數組的指針和指針變量的探究

#include <iostream>

int main() {
    //可以把a看成是一個一維數組,這一個一維數組有三個元素, a[0], a[1], a[2]
    // 每個元素又是一個包含4個元素的一維數組
    //數組名a,同樣代表數組首地址, 假設a[0]的地址在1000, a[1]的地址是1016, a[2]的地址是1032
    int a[3][4];
    int *p;
    p = (int *) a;//強制類型轉換
    p = (int *) (a + 1);// 代表第一行首地址,每行有四個元素,每個元素佔4個字節,a+1要跳過16個字節

    // a[0], a[1], a[2]就是個一維數組名,c語言規定數組名代表數組的首地址
    //也就是說a[0] == &a[0][0]
    p = a[0];
    p = a[1];

    // 第0行第一列元素首地址
    p = &a[0][1];//也可以使用p= a[0]+1;

    return 0;
}

一些推論(假設數組首地址爲1000)

  • a[0] 等價於 *a, 都是數組首地址, 則地址爲1000

  • a[0]+1 等價於 *a+1,等價於 &a[0][1], 也就是地址爲(1004)

  • a[1] 等價於 *(a+1), 等價於1016

  • a[1]+2 等價於 *(a+1)+2, 等價於 &a[1][2], 地址也就是1024

  • *(a[0]+1) 等價於 a[0][1]

  • *(a[1]+2) 等價於 a(*(a+1)+2), 第一行第二列元素值(已哭暈!!)

a[i]的性質

  • 如果是一維數組的話,是代表值,是佔用實際內存的

  • 如果是多維數組的話,是代表地址,a[i]和&a[i]的地址值是一樣的

代碼演示

#include <iostream>

int main() {
    int a[3][4];
    int i,j;
    for(i=0; i<3; i++){
        for(j=0; j<4; j++){
            a[i][j] = 0;
        }
    }
    int  *p;
    p = (int *)(a+1);//第1行首地址
    *p = 56;
    p++;
    *p = 88;

    for(i=0; i<3; i++){
        for(j=0; j<4; j++){
           printf("a[%d][%d]: %d ", i, j, a[i][j]);
        }
    }
    
    return 0;
}

3. 指針數組和數組指針

a) 指針數組

#include <iostream>

int main() {

    // 首先這是個數組,數組中有4個元素,每個元素都是個指針,
    // 所以這相當於定義了4個指針變量
    // 指針數組
    int *p[4];//能引用的下標是0-3

    int a[3][4];
    int i, j;
    for (i = 0; i < 3; i++) {
        for (j = 0; j < 4; j++) {
            a[i][j] = 100;
            printf("a[%d][%d]: %d ", i, j, a[i][j]);
        }
    }
    printf("\n");

    p[0] = &a[0][0];
    p[1] = &a[0][1];
    p[2] = &a[0][2];
    p[3] = &a[0][3];

    for (i = 0; i < 4; i++) {
        printf("the value of *p[%d]: %d ", i, *(p[i]));
    }

    return 0;
}

b) 數組指針

  • 不太好理解,使用不是很多

  • 實例代碼1

#include <iostream>

int main() {

    // 數組指針,注意括號
    //這是一個指針變量,用來指向10個元素得的一維數組
    int (*p)[10];
    int a[10];
    for (int i = 0; i < 10; i++) {
        a[i] = i;
    }
    p = &a;//要用取地址符,否則編譯報錯
    int *q;
    q = (int *) p;
    for (int i = 0; i < 10; i++) {
        printf(" value: %d", *q);
        q++;
    }
    
    return 0;
}
  • 實例代碼2
#include <iostream>

int main() {

    int (*p)[10];
    int a[3][10];
    int i, j;
    for (i = 0; i < 3; i++) {
        for (int j = 0; j < 10; ++j) {
            a[i][j] = i + j;
        }
    }

    p = a;//二維數組名可以直接賦值給數組指針
    int *q;
    q = (int *)p;
    for (i = 0; i < 3; i++) {
        for (int j = 0; j < 10; ++j) {
            printf(" value: %d ", *q);
            q++;
        }
        printf("\n***************************\n");
        p++;

    }
    return 0;
}

4. 多維數組的指針做函數參數

  • 實際應用,建議參考前面的實例
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章