C語言----雙重指標與陣列(高階篇三十五)
多維陣列與指標
指向一維陣列的指標,定義格式為:
int *pa;
int a[5];
pa=a;
指向三維陣列的指標,定義格式為:
int (*pa)[5][8]
int a[3][5][8];
pa=a;
從定義格式中我們看出,指向多維陣列的指標,只有將第一維變成指標,後面的格式保持不變才能進行賦值。
指向二維陣列的指標定義格式為:
int (*pa)[8];
int a[3][8];
pa=a;
※按照以上規律,如果函式之間要傳送一個多維陣列,可用下面三種定義:
void fun ( int (*pa)[5][8],int n){…}
void fun ( int a[][5][8],int n){…}
void fun ( int a[3][5][8],int n){…}
再用以下方式呼叫:
int a[3][5][8]={0};
fun(a,3); // 只將第一維的元素值,傳值。 fun( a, 3) “ 3 ”是:int a[3][5][8]
這樣理解可以簡化成按一維陣列的傳送方式進行傳送。
指標的指標
每個變數都有地址,包括指標變數,如果要儲存指標變數的地址,那隻能定義一個指標的指標,也叫雙重指標,如:
int **ppa,*pa;
ppa=&pa;
雙重指標一般和指標陣列配合使用。
程式1
雙重指標
// 35-1雙重指標.c #include <stdio.h> main() { char *ca[] = { "aaa","bbb","ccc" }; // *ca[] == **ca char **pa = ca; //因為 *ca[] == **ca **pa = ca 不用& for (int i = 0; i < 3; i++) printf("%s\n", *pa++); // 分解: *pa pa++ }
※char **p={“aa”,”bbb”,”cccc”}非法,而char *ca[]={"aa","bbb","cccc"}合法。因為**p只能指向一個指標,而ca[]可以為字串分配記憶體空間,它們道不同不相為謀。
注意:
※指標的指標不能直接指向多維陣列,如:
int **ppa,a[3][3];
ppa=a;
這是不允許的
※“雙重指標不能定義字串,不能指向二維陣列”
main函式引數
Windows中有個“命令列模式”,源自於它的曾曾曾祖父作業系統“DOS”,在沒有滑鼠的情況下,它可以通過給計算機發文字指令的方式來完成作業系統的大部分工作。
比如copy a.txt b.txt命令,會將檔案a.txt複製到檔案b.txt中去。
Windows命令是怎麼做出來的。
main函式還有一種格式:
main(int argc,char *argv[]) //int argc負責接收字串的個數,char *argv[]負責接收若干字串。
根據“多維陣列與指標”的概念,實際上main函式接收的就是一個字串陣列。int argc負責接收字串的個數,char *argv[]負責接收若干字串。
程式2
帶引數的main函式
// 35-2帶引數的main函式.c #include <stdio.h> main(int argc,char *argv[]) { int i = 0; printf("引數個數:%d\n", argc); while (i< argc) { //printf("%s\n", argv[i]); printf("%s\n", *(argv++)); //獲取陣列引數 i++; } }
※字串陣列下標從0開始記數,檔名本身也算1個引數,如:copy a.txt b.txt中的copy也算1個引數,它的下標是0。
※中文和英文的編碼格式不同,因此在程式設計時為減少錯誤的發生,儘量少用中文。