第九章 指針
第六節 數組的指針和指向數組指針的指針變量-3
1. 回顧二維數組和多維數組的概念
-
a[3][4]二維數組
-
a[7][8][9], 三維數組, 排列方式a[0][0][0]…a[0][0][9], a[0][1][0]…最右側維度變化最快,最左側變化最慢
-
多維數組以此類推…
2. 指向多維數組的指針和指針變量的探究
#include <iostream>
int main() {
//可以把a看成是一個一維數組,這一個一維數組有三個元素, a[0], a[1], a[2]
// 每個元素又是一個包含4個元素的一維數組
//數組名a,同樣代表數組首地址, 假設a[0]的地址在1000, a[1]的地址是1016, a[2]的地址是1032
int a[3][4];
int *p;
p = (int *) a;//強制類型轉換
p = (int *) (a + 1);// 代表第一行首地址,每行有四個元素,每個元素佔4個字節,a+1要跳過16個字節
// a[0], a[1], a[2]就是個一維數組名,c語言規定數組名代表數組的首地址
//也就是說a[0] == &a[0][0]
p = a[0];
p = a[1];
// 第0行第一列元素首地址
p = &a[0][1];//也可以使用p= a[0]+1;
return 0;
}
一些推論(假設數組首地址爲1000)
-
a[0] 等價於 *a, 都是數組首地址, 則地址爲1000
-
a[0]+1 等價於 *a+1,等價於 &a[0][1], 也就是地址爲(1004)
-
a[1] 等價於 *(a+1), 等價於1016
-
a[1]+2 等價於 *(a+1)+2, 等價於 &a[1][2], 地址也就是1024
-
*(a[0]+1) 等價於 a[0][1]
-
*(a[1]+2) 等價於 a(*(a+1)+2), 第一行第二列元素值(已哭暈!!)
a[i]的性質
-
如果是一維數組的話,是代表值,是佔用實際內存的
-
如果是多維數組的話,是代表地址,a[i]和&a[i]的地址值是一樣的
代碼演示
#include <iostream>
int main() {
int a[3][4];
int i,j;
for(i=0; i<3; i++){
for(j=0; j<4; j++){
a[i][j] = 0;
}
}
int *p;
p = (int *)(a+1);//第1行首地址
*p = 56;
p++;
*p = 88;
for(i=0; i<3; i++){
for(j=0; j<4; j++){
printf("a[%d][%d]: %d ", i, j, a[i][j]);
}
}
return 0;
}
3. 指針數組和數組指針
a) 指針數組
#include <iostream>
int main() {
// 首先這是個數組,數組中有4個元素,每個元素都是個指針,
// 所以這相當於定義了4個指針變量
// 指針數組
int *p[4];//能引用的下標是0-3
int a[3][4];
int i, j;
for (i = 0; i < 3; i++) {
for (j = 0; j < 4; j++) {
a[i][j] = 100;
printf("a[%d][%d]: %d ", i, j, a[i][j]);
}
}
printf("\n");
p[0] = &a[0][0];
p[1] = &a[0][1];
p[2] = &a[0][2];
p[3] = &a[0][3];
for (i = 0; i < 4; i++) {
printf("the value of *p[%d]: %d ", i, *(p[i]));
}
return 0;
}
b) 數組指針
-
不太好理解,使用不是很多
-
實例代碼1
#include <iostream>
int main() {
// 數組指針,注意括號
//這是一個指針變量,用來指向10個元素得的一維數組
int (*p)[10];
int a[10];
for (int i = 0; i < 10; i++) {
a[i] = i;
}
p = &a;//要用取地址符,否則編譯報錯
int *q;
q = (int *) p;
for (int i = 0; i < 10; i++) {
printf(" value: %d", *q);
q++;
}
return 0;
}
- 實例代碼2
#include <iostream>
int main() {
int (*p)[10];
int a[3][10];
int i, j;
for (i = 0; i < 3; i++) {
for (int j = 0; j < 10; ++j) {
a[i][j] = i + j;
}
}
p = a;//二維數組名可以直接賦值給數組指針
int *q;
q = (int *)p;
for (i = 0; i < 3; i++) {
for (int j = 0; j < 10; ++j) {
printf(" value: %d ", *q);
q++;
}
printf("\n***************************\n");
p++;
}
return 0;
}
4. 多維數組的指針做函數參數
- 實際應用,建議參考前面的實例