一 陣列名指標
c++編譯器將陣列名解釋為指標
#include using namespace std;
int main()
cout<<"sz:"<
編譯器將陣列名解釋為陣列記憶體區域的首位址,對一維陣列來說要實現對某個元素的訪問,既可以用陣列名+下標的形式,也可以用間接引用*(陣列名+偏移)
陣列元素的指標形式:
指向陣列的指標
陣列名可以當指標來使用,但是陣列名是常量,其值是不變的,c++不允許修改陣列名的值,所以陣列名不是很靈活。
陣列名指標恆指向陣列所佔記憶體區域的第乙個位元組,對一維陣列來說陣列名指標指向第0個元素,對多維陣列來說,陣列名指標指向第[0][0][0].....[0]個元素。
指向陣列的指標:
#include using namespace std;
int main()
p=sz; //p=&sz[0]
for (int i=0; i<5; i++)
return 0;
}
如果陣列是多維陣列,有兩種指標宣告方式:普通指標形式,陣列名試用法
1.普通指標形式
#include using namespace std;
int main()}}
p=a[0][0];
for (int i=0; i<2; i++)}}
return 0;
}
初始化指標p時有以下幾種方式,是其指向陣列所佔記憶體單元的首位元組
int *p=&a[0][0][0];
int *p=a[0][0];
int *p=(int*)a[0];
int *p=(int*)a;
在訪問a[i][j][k]時採用了語句
*(p+3*
4*i+
4*j+k),解釋一下:要訪問a[i][j][k],那麼相當於指標要跳過a[i][j]的所有元素再訪問第k個元素
每個a[i]對應了3*4個元素(j*k),每個a[i][j]對應了4個元素(k)。其實多維陣列在記憶體中也是線性儲存的,要訪問後邊的元素,需要跳過前面的元素。(個人理解,若有錯,請指出,謝謝)。不能用*(*(*(p+i)+j)+k)訪問元素喲,原因在於p是普通的int指標,對p的算術運算,指標在記憶體中的移動單位只取決於int型資料的大小,所以訪問不到正確地元素啦,如果想要使用這種形式,需要指出第二維開始的大小,這就是陣列名試用法。
2.陣列名試用法
#include using namespace std;
int main()}}
p=a;
for (int i=0; i<2; i++)}}
return 0;
}
*(*(*(p+i)+j)+k)
可以直接寫成p[i][j][k],指標也可以當陣列用,但對宣告的普通指標,這種用法是非法的。
陣列指標
(也稱行指標) 定義 int (*p)[n];因為的優先順序比*高,不加括號的話p要先與結合就成了指標陣列了,首先說明p是乙個指標,指向乙個整型的一維陣列,這個一維陣列的長度是n,也可以說是p的步長。也就是說執行p+1時,p要跨過n個整型資料的長度。
如要將二維陣列賦給一指標,應這樣賦值:
int a[3][4];
int(*p)[4]; //該語句是定義乙個陣列指標,指向含4個元素的一維陣列。
p=a; //將該二維陣列的首位址賦給p,也就是a[0]或&a[0][0] .
p++; //該語句執行過後,也就是p=p+1;p跨過行a[0]指向了行a[1]
所以陣列指標也稱指向一維陣列的指標,亦稱行指標。
#includeint a[100][100];
int main(void)
指標陣列 定義 int *p[n]; 優先順序高,先與p結合成為乙個陣列,再由int*說明這是乙個整型指標陣列,它有n個指標型別的陣列元素。這裡執行p+1是錯誤的,這樣賦值也是錯誤的:p=a;因為p是個不可知的表示,只存在p[0]、p[1]、p[2]...p[n-1],而且它們分別是指標變數可以用來存放變數位址。但可以這樣 *p=a[0]; 這裡*p表示指標陣列第乙個元素的值,a的首位址的值。
如要將二維陣列賦給一指標陣列:
int *p[3];
int a[3][4];
for(i=0;i<3;i++)
這裡int *p[3] 表示乙個一維陣列內存放著三個指標變數,分別是p[0]、p[1]、p[2] 所以要分別賦值。
這樣兩者的區別就豁然開朗了,陣列指標只是乙個指標變數,似乎是c語言裡專門用來指向二維陣列的,它占有記憶體中乙個指標的儲存空間。指標陣列是多個指標變數,以陣列形式存在記憶體當中,占有多個指標的儲存空間。 還需要說明的一點就是,同時用來指向二維陣列時,其引用和用陣列名引用都是一樣的。 比如要表示陣列中i行j列乙個元素: *(p[i]+j)、*(*(p+i)+j)、(*(p+i))[j]、p[i][j]。
#include#include int main()
}for (int i=0; i<5; i++)
for (int i=0; i<5; i++)
printf("\n");
}return 0;
}
指標陣列可以直接為其分配空間,就成了二維陣列了。
#include#include int main()
for (int i=0; i<5; i++)
}for (int i=0; i<5; i++)
printf("\n");
}return 0;
}
利用二級指標
#include#include //動態分配二維陣列
int main()
{
int **p; //二級指標
int a,b;
int i,j;
printf("請輸入二維陣列大小a,b:");
scanf("%d%d",&a,&b);
p=(int **)malloc(sizeof(int*)*a); //這裡讓二級指標p成為了指標陣列了
for(i=0; i
優先順序:( ) > > *
C語言指標初探 一 指標與函式
1.通過指標引數申請動態記憶體。2 利用函式返回值申請動態記憶體。3 返回棧記憶體的 或靜態儲存區的 指標或引用。以上知識請參考 記憶體管理。4 函式引數的三種傳遞方式 1 值傳遞 這個應該簡單吧,來看個經典程式 include include using namespace std void sw...
指標與陣列(一) 指標認知
一 定義與初始化 1.如何理解指標?1 指標是變數。2 指標是乙個位址,指向的是個型別。3 指標指向的是位址,位址指向的是內容。4 指標的指標,是面對於指標的變數。5 指標型別的位元組長度由作業系統決定 32位作業系統為4位元組,64位作業系統為8位元組 2.定義指標的幾種規範 int p 重在表示...
c語言與指標 (一)指標與變數
寫在前面 指標是學習c語言時,最讓人頭痛的乙個難題。但是指標不僅是c語言的精髓,它還貫穿整個計算機底層儲存與訪問方式。指標實際上就是位址,指標變數用來存放指標 位址 指標變數也是一種變數,它和不同的變數同樣要佔一定的儲存空間。但指標變數與不同的變數不同之處在於,指標的儲存空間存放的不是不同的資料,而...