關於C使用指標獲取二維字元陣列資訊
阿新 • • 發佈:2019-01-29
最近在完成一個專案,專案中頻繁的使用到字元二維陣列,今天就個人在實際中的經驗來總結一個比較好的使用方法,歡迎各位大神踴躍拍磚。
測試的二維陣列:
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
*/
所以通過上面的程式碼示例,大家可以對行指標有一個初步的瞭解,從而對使用指標獲取二維字元陣列有一個初步的認識。