指針數組與數組指針
時間:2018-03-09作者:華清遠見
一、 指針數組 定義:指針數組可以說成是”指針的數組”,首先這個變量是一個數組,其次,”指針”修飾這個數組,意思是說這個數組的所有元素都是指針類型,在32位系統中,指針占四個字節。 Char *array[5] = {“welcome”,”to”,”wuhan”,”guanggu”,“now”}; //array就是我們定義的一個指針數組,它有四個元素,每個元素是一個char *類型的指針,這些指針存放著其對應字符串。 我們可以寫成: Char *(array[5])= {“welcome”,”to”,”wuhan”,”guanggu”,“now”};
這個指針數組的長度為20個字節,因為每個數組元素里存放的都是一個指針,指針的長度就是四個字節。
數組里面的每一個成員都保存著一個字符串的地址,每個字符串都存在內存的常量區。 一、 數組指針 定義:數組指針可以說成是”數組的指針”,首先這個變量是一個指針,其次,”數組”修飾這個指針,意思是說這個指針存放著一個數組的首地址,或者說這個指針指向一個數組的首地址。 首先來定義一個數組指針,既然是指針,名字就叫pa char (*pa)[5];
如果指針數組和數組指針這倆個變量名稱一樣就會是這樣:char *pa[5]和char (*pa)[5],原來指針數組和數組指針的形成的根本原因就是運算符的優先級問題,所以定義變量是一定要注意這個問題,否則定義變量會有根本性差別! pa是一個指針指向一個char [5]的數組,每個數組元素是一個char類型的變量,所以我們不妨可以寫成:char[5] (*pa);這樣就可以直觀的看出pa的指向的類型,不過在編輯器中不要這么寫,因為編譯器根本不認識,這樣寫只是幫助我們理解。 既然pa是一個指針,存放一個數組的地址,那么在我們定義一個數組時,數組名稱就是這個數組的首地址,那么這二者有什么區別和聯系呢? char a[5]; a是一個長度為5的字符數組,a是這個數組的首元素首地址。既然a是地址,pa是指向數組的指針,那么能將a賦值給pa嗎?答案是不行的!因為a是數組首元素首地址,pa存放的卻是數組首地址,a是char 類型,a+1,a的值會實實在在的加1,而pa是char[5]類型的,pa+1,pa則會加5,雖然數組的首地址和首元素首地址的值相同,但是兩者操作不同,所以類型不匹配不能直接賦值,但是可以這樣:pa = &a,pa相當與二維數組的行指針,現在它指向a[5]的地址。 這里有個有意思的話題值得探討一下:平時我們定義指針不都 是在數據類型后面加上指針變量名么?這個指針pa 的定義怎么不是按照這個語法來定義的呢?也許我們應該這樣來定義pa: int (*)[5] pa; int (*)[5]是指針類型,pa 是指針變量。這樣看起來的確不錯,不過就是樣子有些別扭。其實數組指針的原型確實就是這樣子的,只不過為了方便與好看把指針變量pa 前移了而已。你私下完全可以這么理解這點。雖然編譯器不這么想。 相關資訊
發表評論
|