1. 程式人生 > >關於C使用指標獲取二維字元陣列資訊

關於C使用指標獲取二維字元陣列資訊

最近在完成一個專案,專案中頻繁的使用到字元二維陣列,今天就個人在實際中的經驗來總結一個比較好的使用方法,歡迎各位大神踴躍拍磚。
測試的二維陣列:

char ch[][50] = {
    "1-2-3",
    "4-5-6",
    "7-8-9"
};

下面我們通過兩種方法來獲取這個二維陣列的資訊

使用下標輸出

#include "stdio.h"
int main(int argc, const char * argv[]) {
    char ch[][50] = {
        "1-2-3",
        "4-5-6",
        "7-8-9"
}; for (int i = 0; i < 3; ++i){ for (int j = 0; j < 6; ++j){ printf("%c", ch[i][j]); } printf("\n"); } return 0; } /*程式輸出: 1-2-3 4-5-6 7-8-9 Program ended with exit code: 0 */

大家可以看到在使用的時候極為的不方便,每一行還得數一下才能確定j的範圍。下面我們介紹一下采用指標的方式輸出。

使用指標輸出

一維字元陣列

我們先從最簡單的一維字元陣列談起。我們都知道,在儲存一個字串的時候,字串後面會跟著一個’\0’,證明程式碼如下:

#include "stdio.h"
int main(int argc, const char * argv[]) {
    char ch[] = {"abc"};

    printf("陣列ch的長度是%lu\n",sizeof(ch)/sizeof(ch[0]));
    printf("----------------\n");

    for (int i = 0; i < sizeof(ch)/sizeof(ch[0]); i ++) {
        printf
("ch[%d]內容的16進位制數為%#X\n",i,ch[i]); } return 0; } /*程式輸出: 陣列ch的長度是4 ---------------- ch[0]內容的16進位制數為0X61 ch[1]內容的16進位制數為0X62 ch[2]內容的16進位制數為0X63 ch[3]內容的16進位制數為0 Program ended with exit code: 0 */

空字元就是\0
這裡寫圖片描述
所以我們可以利用這個\0來輸出一維字元陣列的內容:

#include "stdio.h"
int main(int argc, const char * argv[]) {
    char ch[] = {"abc"};

    char *p = ch;//p獲得陣列首地址
    for (; *p != '\0'; p ++) {
        printf("%c",*p);
    }
    printf("\n");
    return 0;
}

/*程式輸出:
abc
Program ended with exit code: 0
*/

二維字元陣列

這個二維字元陣列其實也特別的簡單,只是比一維陣列多了一個“行”。我看了網上很多教程,也談到了行指標和列指標,估計初學者應該是一臉懵逼的。
那麼,在獲取二維字串陣列的時候,請大家牢記這個

char (*p)[50] = ch; 

這個就是我們剛才講到的“行指標”,這種定義方法相信很多初學者應該是沒有見過的,或者是覺得特別的奇怪,奇怪就奇怪吧,反正大家只要牢記這個就可以了。廢話不多說線上程式碼:

#include "stdio.h"
int main(int argc, const char * argv[]) {
    char ch[][50] = {
        "1-2-3",
        "4-5-6",
        "7-8-9"
    };

    char (*p)[50] = ch;//請注意格式
    //取一行
    printf("*(p2 + 0)取到第1行:%s\n",*(p + 0));
    printf("*(p2 + 1)取到第2行:%s\n",*(p + 1));
    printf("*(p2 + 2)取到第3行:%s\n",*(p + 2));
    return 0;
}

/*程式輸出:
*(p2 + 0)取到第1行:1-2-3
*(p2 + 0)取到第2行:4-5-6
*(p2 + 0)取到第3行:7-8-9
Program ended with exit code: 0
*/

我們可以看到,這個p儲存的,是一行資料的地址,要列印也只能列印一行,如果是以%c輸出直接就會報錯了。所以我們這裡要有一個印象:*p = 一行的資訊。
那麼我們怎樣取到這一行中的每一個元素資訊呢?那就要利用前面講到的一維字元陣列使用,我們需要定義:

char *q = (char *)p;//需要強轉成char *

所以我們有以下程式碼:

#include "stdio.h"
int main(int argc, const char * argv[]) {
    char ch[][50] = {
        "1-2-3",
        "4-5-6",
        "7-8-9"
    };

    char (*p)[50] = ch;//請注意格式
    //取一行
    printf("*(p2 + 0)取到第1行:%s\n",*(p + 0));
    printf("*(p2 + 1)取到第2行:%s\n",*(p + 1));
    printf("*(p2 + 2)取到第3行:%s\n",*(p + 2));

    //訪問第一行元素
    char *q = (char *)p;
    printf("*(q + 0)取到第1個字元:%c\n",*(q + 0));
    printf("*(q + 1)取到第2個字元:%c\n",*(q + 1));
    printf("*(q + 2)取到第3個字元:%c\n",*(q + 2));
    //訪問第二行元素
    printf("-----------\n");
    p ++; //下一行
    q = (char *)p;
    printf("*(q + 0)取到第1個字元:%c\n",*(q + 0));
    printf("*(q + 1)取到第2個字元:%c\n",*(q + 1));
    printf("*(q + 2)取到第3個字元:%c\n",*(q + 2));

    return 0;
}

/*程式輸出:
*(p2 + 0)取到第1行:1-2-3
*(p2 + 1)取到第2行:4-5-6
*(p2 + 2)取到第3行:7-8-9
*(q + 0)取到第1個字元:1
*(q + 1)取到第2個字元:-
*(q + 2)取到第3個字元:2
-----------
*(q + 0)取到第1個字元:4
*(q + 1)取到第2個字元:-
*(q + 2)取到第3個字元:5
Program ended with exit code: 0
*/

所以通過上面的程式碼示例,大家可以對行指標有一個初步的瞭解,從而對使用指標獲取二維字元陣列有一個初步的認識。