天天看點

c++數組指針和指針數組詳解

指針數組:

指針數組可以說成是”指針的數組”,首先這個變量是一個數組,其次,”指針”修飾這個數組,意思是說這個數組的所有元素都是指針類型,在32位系統中,指針占四個位元組。

數組指針:

數組指針可以說成是”數組的指針”,首先這個變量是一個指針,其次,”數組”修飾這個指針,意思是說這個指針存放着一個數組的首位址,或者說這個指針指向一個數組的首位址。

指針數組

首先先定義一個指針數組,既然是數組,名字就叫arr

arr[4]是一個定義的數組。把它對應到對應到記憶體中,arr是一個在棧區,有四個元素的數組,而每一個元素又是一個指針,是以說它的四個元素各占四個位元組,是以變量arr的大小是16個位元組。

arr+1會跳過四個位元組

。也就是一個指針的大小 。

數組指針

首先來定義一個數組指針,既然是指針,名字就叫pa,要給指針加括号。

pa是一個指針指向一個char [4]的數組,每個數組元素是一個char類型的變量。既然pa是一個指針,存放一個數組的位址,那麼在我們定義一個數組時,

數組名稱就是這個數組的首位址,那麼這二者有什麼差別和聯系呢

數組名稱和數組指針的差別

a是一個長度為4的字元數組,a是這個數組的首元素首位址。既然a是位址,pa是指向數組的指針,那麼能将a指派給pa嗎?答案是不行的!因為a是數組首元素首位址,pa存放的卻是數組首位址,a是char 類型,a+1,a的值會實實在在的加1,而pa是char[4]類型的,pa+1,pa則會加4,雖然數組的首位址和首元素首位址的值相同,但是兩者操作不同,是以類型不比對不能直接指派,但是可以這樣:pa = &a,pa相當與二維數組的行指針,現在它指向a[4]的位址。

數組名和指針雖都代表數組首元素的位址,但意義不同。把它們分别比作省政府和市政府,數組名相當于省政府,指向首元素的指針代表市政府。如陝西的省政府在西安,而西安市的市政府也在西安,兩個政府都在西安,但其代表的意義完全不同。

 ①用sizeof關鍵字求數組所占的記憶體是整個數組大小,指針不是。

 ②對數組名取位址時是取得一個代表整個數組的位址,對指針取位址則不然。

指針數組在參數傳遞時的使用

指針數組常用在主函數傳參,在寫主函數時,參數有兩個,一個确定參數個數,一個這是指針數組用來接收每個參數(字元串)的位址

int main(int argc, char *argv[])

不能傳遞整個數組過去,如果數組很大,這樣記憶體使用率很低,是以應該傳遞數組的首位址,用一個指針接收這個位址。是以,指針數組對應着二級指針

void fun(char **pp); //子函數中的形參

fun(char *p[]); //主函數中的實參

數組指針傳參時的使用

數組指針既然是一個指針,那麼就是用來接收位址,在傳參時就接收數組的位址,是以

數組指針對應的是二維數組

void fun(int (*P)[4]);   		//子函數中的形參,指針數組 
a[3][4] = {0};              	//主函數中定義的二維數組
fun(a);                       	//主函數調用子函數的實參,是二維數組的首元素首位址
           
c++數組指針和指針數組詳解

sizeof(a)=12*4=48

sizeof(p)=4 //(x64系統為8)

當sizeof用于變量時傳回這個變量占用的實際空間的大小。當sizeof用于數組名時,傳回整個數組的大小(這裡的大小指占用的位元組數)。p是一個指針變量,這個變量占用四個位元組。

繼續閱讀