山不在高,有仙則名。水不在深,有龍則靈。 ----CSDN 時時三省
在了解了指針數組的基礎上,需要了解指向指針數據的指針變量,簡稱為指向指針的指針。
怎樣定義一個指向指針數據的指針變量呢?下面定義一個指向指針數據的指針變量:
char * * p ;
P的前面有兩個*號。*運算符的結合性是從右到左,因此* * p相當于* ( *p ),顯然*p是指針變量的定義形式。如果沒有最前面的*,那就是定義了一個指向字符數據的指針變量。現在它前面又有一個*號,即char * * p。可以把它分為兩部分看,即:char*和( *p ),后面的( * p )表示p是指針變量,前面的char *表示p指向的是char型的數據。也就是說,p指向一個字符指針變量(這個字符指針變量指向一個字符型數據)。如果引用xp,就得到p所指向的字符指針變量的值,如果有:
p = name + 2 ;
printf ( " % d\n”,* p );
printf ( " % s\n ",* p );
第1個printf函數語句輸出name [ 2 ]的值(它是一個地址),第2個printf函數語句以字符串形式( % s )輸出字符串“Great Wall”。
例題:
使用指向指針數據的指針變量。
解題思路:
定義一個指針數組name,并對它初始化,使name數組中每一個元素分別指向5個字符串。定義一個指向指針型數據的指針變量p,使p先后指向name數組中各元素,輸出這些元素所指向的字符串。
編寫程序:
運行結果:?
程序分析:
p是指向char*型數據的指針變量,即指向指針的指針。在第1次執行for循環體時,賦值語句“p = name + i;”使p指向name數組的0號元素name [ 0 ],* p是name [ 0 ]的值,即第1個字符串首字符的地址,用printf函數輸出第1個字符串(格式符為%s)。執行5次循環體,依次輸出5個字符串。
例題2:
有一個指針數組,其元素分別指向一個整型數組的元素,用指向指針數據的指針變量,輸出整型數組各元素的值。
編寫程序:
?運行結果:
程序分析:?
程序中定義p是指向指針型數據的指針變量,開始時指向指針數組num的首元素num [ 0 ],而num [ 0 ]是一個指針型的元素,它指向整型數組a的首元素a [ 0 ]。開始時p的值是& num [ 0 ],*p是num [ 0 ]的值,即&a [ 0 ],* ( *p )是a [ 0 ]的值。因此第1個輸出的是a [ 0 ]的值1。然后執行p + +,p就指向num[1]再輸出* *p,就是a [ 2 ]的值3了。請不要把第3和第4行錯寫為
int * num [ 5 ] = ( 1,3 , 5 , 7 , 9 );
指針數組的元素只能存放地址,不能存放整數。
“間接訪問”變量的方式。利用指針變量訪問另一個變量就是“間接訪問”。如果在一個指針變量中存放一個目標變量的地址,這就是“單級間址”,指向指針數據的指針用的是“二級間址”方法,從理論上說,間址方法可以延伸到更多的級,即多重指針,但實際上在程序中很少有超過二級間址的。級數愈多,愈難理解,容易產生混亂,出錯機會也多。
?
?
?