指標的值是它所指向物件的位址。位址的表示方式依賴於計算機內部的硬體。許多計算機都是按照位元組編址的,意思時記憶體中的每乙個位元組都按順序編號,這裡,乙個較大的位址通常是該物件的第乙個位元組的位址。
因此,使用指標會更加的有效率,能夠很好的處理陣列,陣列表示法其實是在變相的使用指標。
#include
"stdio.h"
intmain()
,,,}
;return
520;
}
1. data是陣列首元素的位址 因此data=
&data[0]
2.*data=data[0]
**data=data[0]
[0]3. data[1]
[2]=
*(*(data+1)+2)
前兩條結論很簡單,但是第三題結論理解起來可能有點難度,現在我們來剖析一下第三條結論.
data ← 二維陣列首元素位址
data+
1 ← 二維陣列的第二個元素(即一維陣列)的位址
*(data+
1) ←二維陣列的第第二個元素(即一維陣列)的首元素
*(data+1)
+2 ←二維陣列的第二個元素(即一維陣列)的第三個元素(乙個int型別的值)的位址*(
*(data+1)
+2)←二維陣列的第二個元素的第三個int型別元素的值
不知道說到這裡有沒有說清楚呢?
這個圖便形象的展示了陣列的陣列。
如何宣告乙個指標變數pz指向乙個二維陣列呢? 在編寫類似data這樣的二維陣列時會用到這樣的指標,把指標宣告為指向int的型別還不夠。因為指向int只能與data[0]的型別匹配,說明該指標指向乙個int型別的值,但是data是他首元素的位址,而該元素是乙個內含兩個int型別值的一維陣列,因此,pz必須指向乙個內含兩個int型別值的陣列,而不是指向乙個int型別值。
int
(*pz)[2
];//pz指向乙個內含兩個int型別值的陣列
int*pax[2]
;//pax是乙個內含兩個指標元素的陣列,每個元素都指向int型別的指標
這兩種宣告有何細節可言呢?
前者使用圓括號,是因為的優先順序要高於*,因此*先與pz結合,因此宣告的是乙個指向陣列(內含兩個int型別的值)的指標。
對於後者,由於優先順序高,先於pax結合,所以pax成為乙個內含兩個元素的陣列,然後星號表示pax陣列內含有兩個指標。最後int表示pax陣列中的指標都指向int型別的值。因此,後者宣告了兩個指向int的指標。
數值型別之間的賦值:
int n=5;
double x;
x=n;
//隱式型別轉換
指標的賦值:
int
*pl=
&n;double
&pd=
&x;pd=pl;
//編譯時錯誤
指標之間的賦值比數值型別之間的賦值要嚴格
const在陣列中的應用常常是定義在形參中防止陣列內容被修改。
#include
"stdio.h"
void
excute
(const
int a)
intmain()
c和c++中const的用法很相似,但是並不完全相同。區別之一是,c++允許在宣告陣列大小時使用const整數,而c卻不允許。區別之二是,c++的指標賦值檢查更嚴格:
const
int y;
const
int*p2=
&y;int
*p1;
p1=p2;
//c++中不允許這麼做,但是c可能只會給出警告
c++不允許把const指標賦給非const 指標。而c則允許這樣做,但是如果通過p1更改y,其行為是未定義的。 多維陣列和多維指標
指向指標的指標 指標變數在記憶體中會占用一定的空間 可以定義指標來儲存指標變數的位址 int pp本質上還是指標,只是兩個 告訴你這是乙個指向指標的指標char p null char p2 p p2 給p賦值沒有問題,但怎麼使用p 呢?這就需要我們前面多次提到的鑰匙 第一步 根據 p 這個變數,取...
多維陣列 和 多維指標
指標變數在記憶體中會占用一定的空間。可以定義指標來儲存指標變數的位址值。舉例 舉例說明,多級指標的使用,重置動態空間大小 include include int reset char p,int size,int new size else return ret int main return 0 ...
多維陣列和多維指標
專題四 指標和陣列 下 包括以下章節 指標變數在記憶體中會占用一定的空間可以定義指標來儲存指標變數的位址值為什麼需要指向指標的指標?指標在本質上也是變數 對於指標也同樣存在傳值呼叫與傳址呼叫 2 1.c include include char p p指向的是乙個char 指標 int size 原...