第九章 指針
第四節 數組的指針和指向數組指針的指針變量-1
1. 指向數組元素的指針變量的定義和賦值
-
數組指針 是指 數組開始的地址,數組元素的指針就是數組元素的地址
-
只要是數組,那麼數組元素的內存一定是挨着的
#include <iostream>
int main() {
int a[5] = {5, 6, 7, 8, 9}; //能夠引用的是a[0]-a[4]
a[3] = 6;//下標法引用數組元素,也可以使用指針引用數組元素
// a == &a[0]
int *p; // 指針變量,整型指針變量,和數組a類型相同
//把a[0]元素的地址賦給指針變量p,把p指向數組變量第0號元素
//也就等價於p=a
p = &a[0];
return 0;
}
- 定義指針變量時也可以給指針變量賦予初值
int *p = &a[0];
//或者
int *p = a;
2. 通過指針引用數組元素
仔細看下面的效果
-
*p=19; // 相當於修改a[0], 使得 a[0] = 19
-
p = p + 1; //因爲p是整型,相當於地址增加4個字節,跳過一個完整的整型,也就是p的值爲a[1]的地址,
即p指向a[1] -
p + i 或者是 a + i // i是數組元素的下標(0-4),假設p指向a[0]的話,那麼a+i或p+i就是數組元素a[i]的地址,
也就是說,它們指向了數組a的第i個元素,也就是說p+3或者a+3的值爲&a[3],也就是說都指向a[3].
結論是 a+i或者p+i都是地址,既然是地址,就可以賦給指針變量
-
*(p+i)或者*(a+i),也就等價於a[i]的值
-
p[i] // i是數組元素的下標(0-4),p[i]= *(p+i) = a[i]
-
引用數組元素有很多方法:
a[i], p[i], *(p+i), *(a+i)
#include <iostream>
int main() {
int a[5] = {5, 6, 7, 8, 9}; //能夠引用的是a[0]-a[4]
a[3] = 6;//下標法引用數組元素,也可以使用指針引用數組元素
// a == &a[0]
int *p; // 指針變量,整型指針變量,和數組a類型相同
//把a[0]元素的地址賦給指針變量p,把p指向數組變量第0號元素
//也就等價於p=a
p = &a[0];
*p = 19;//等價與a[0] = 19
p = p + 1;
*p = 100;
*(p+2) = 102;
p = a;
printf("p[2]: %d\n", p[2]);
return 0;
}
- 實例
#include <iostream>
int main() {
int a[5] = {1, 2, 3, 4, 5};
int *p;
int i;
p = a;
for (i = 0; i < 5; i++) {
printf("a[%d]: %d, ", i, a[i]);
printf("*(a+%d): %d, ", i, *(a + i));
printf("p[%d]: %d, ", i, p[i]);
printf("*(a+%d): %d \n", i, *(a + i));
}
// 效率更高
for(p=a;p<(a+5);p++){
printf("*p: %d \n", *p);
}
return 0;
}
- 注意事項
-
數組首地址不能進行++操作,不能寫成a++
-
a[5]按照*(a+5)來進行計算地址,地址是存在的,但是不能給a[5]賦值,數組越界了,不能使用
- *p++:優先級相同,並且都是從右到左結合,所以等價於*(p++), 得到p指向的變量的值(*p), 再考慮自身p自加1
#include <iostream>
int main() {
int a[5] = {1, 2, 3, 4, 5};
int *p;
p = a;
// 打印p的值, p再指向a[1]
printf("*p++: %d", *p++);
return 0;
}
- *++p:和*p++是不同的,所以等價於,p先加1,然後再取地址
#include <iostream>
int main() {
int a[5] = {1, 2, 3, 4, 5};
int *p;
p = a;
// p先指向a[1], 打印出a[1]
printf("*++p: %d", *++p);
return 0;
}
- (*p)++:p所指向的元素加1, 相當於a[0]++,數組元素值加1
#include <iostream>
int main() {
int a[5] = {1, 2, 3, 4, 5};
int *p;
p = a;
// 相當於a[0]++
(*p)++;
printf("a[0]: %d", a[0]);
return 0;
}