1. 程式人生 > 其它 >C/C++ 指標陣列和陣列指標的認識

C/C++ 指標陣列和陣列指標的認識

指標陣列

指標陣列的理解: 指標陣列顧名思義是指標組成的陣列, 組成元素是指標變數。

字串初始化指標陣列:

#include<stdio.h>

int main(void) {

    char *a[3] = { "hello", "world", "good" };    // 定義指標陣列a[],並對其初始化,把字串的首地址賦給它.
    char  **p;
    p = a;

    for (int i = 0; i < 3; i++) {
        printf("*p: %%d = %d\n", *p);        //這個輸出的是各字串的首地址.
        printf("*p: %%s = %s\n", *p);
        printf("**p: %%d = %d\n", **p);    //輸出各字串首各字母h w  g的  ascii碼值
        printf("**p: %%c = %c\n", **p);    //輸出各字串首字母       
        printf("*p++: %%s = %s\n", *p++);    //輸出字串,%s --給它字串的首地址就好了!
        printf("------------\n");
    }

    return 0;
}

執行:

*p: %d = 8944628
*p: %s = hello
**p: %d = 104
**p: %c = h
*p++: %s = hello
------------
*p: %d = 8944432
*p: %s = world
**p: %d = 119
**p: %c = w
*p++: %s = world
------------
*p: %d = 8944460
*p: %s = good
**p: %d = 103
**p: %c = g
*p++: %s = good
------------

指標陣列的初始化可以分開寫:

char *a[3];
a[0] = "Hello";
a[1] = "World";
a[2] = "Good";

int 型陣列:

#include

int main(void) {

    int a[3] = { 1, 2, 3 };
    int  **p;
    int *m[3];

    for (int i = 0; i < 3; i++) {
        m[i] = &a[i];
        p = &m[i];
        printf("m[%d] = %d\n", i, **p);
    }

    return 0;
}

執行:

m[0] = 1
m[1] = 2
m[2] = 3
請按任意鍵繼續. . .

順便測試下二級指標。

程式碼不能寫成這樣子:

int *a[3] = { 1, 2, 3 };

這樣是錯誤的,指標變數 a 應該賦值地址給它,這樣是一個 int 常量,錯誤!

陣列指標

陣列指標就是指向陣列的指標咯!

#include 

using namespace std;

int main(void) {
    int *p;
    int a[3] = { 3, 2, 1 };
    p = a;
    for (int i = 0; i < 3; i++) {
        cout << 'a' << '[' << i << "] = " << *(p + i) << endl;
    }

    return 0;
}

執行:

a[0] = 3
a[1] = 2
a[2] = 1
請按任意鍵繼續. . .

m 個元素組成的一維陣列的指標變數——int (*p)[m]的理解:

#include

int main() {

    int a[6] = { 0, 1, 2, 3, 4, 5 };
    int(*pt)[6] ;
    pt = &a; // 相當於含一個一維陣列的二維陣列,這裡必須加取地址符 &,
    // 可以直接寫成: int (*pt)[6] = &a;  // 不能寫成 int (*pt)[6] = a;

    printf("**pt = %d\n", **pt);
    printf("*(*pt + 1) = %d\n", *(*pt + 1));
    printf("*(*pt + 2) = %d\n", *(*pt + 2));
    /* ... */

    return 0;
}

執行:

**pt = 0
*(*pt + 1) = 1
*(*pt + 2) = 2
請按任意鍵繼續. . .

其實是可以這樣理解的:一對[]等價於一個*;所以,int(*pt)[6]可以理解為雙重指標,它只能指向含有 6 個元素 (int) 的一位陣列,上例改為int (*pt)[8] = &a // 或者不是 8 的其他數字。就會出錯。

#include

int main() {

    int a[3][4] = { { 1, 2, 3, 4 },
                    { 5, 6, 7, 8 },
                    { 9, 10, 11, 12 }
    };
    int(*p)[4], i, j;

    p = a;
    printf("請輸入你想要輸出元素的行和列:");
    scanf_s("%d,%d", &i, &j);
    printf("a[%d][%d]=%d\n", i, j, *(*(p + i) + j));
    // 從第 0 行開始輸出a[i][j].

    return 0;
}

``
請輸入你想要輸出元素的行和列:1,2
a[1][2] = 7
請按任意鍵繼續. . .

這裡用二維陣列就比較好理解了,指向含有 4 個元素的一維陣列。

note: 指標變數就是用來放地址的,指標變數存放的值就是地址。巨集觀講,指標就是地址地址就是指標。