### 數組
數組名是數組的首地址,這是一個常量.
~~~
int arr[10] = {0};
printf("%p\n", arr);
printf("%p\n", &arr[0]);
arr = 10; //無法修改
~~~
### 指針降級操作
~~~
int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
// printf("%p\n", arr);
// printf("%p\n", &arr[0]);
int *p = arr; //沒有&符號
*p = 100;
*(p + 1) = 200;
p[5] = 300; // *(p+5)
for (int i = 0; i < 10; ++i) {
printf("%d\n", p[i]); //指向數組的指針,當操作指針的時候,簡介的操作了數組
printf("%d\n", *(p + i));
}
~~~
```
100
100
200
200
3
3
4
4
5
5
300
300
7
7
8
8
9
9
10
10
```
### 數組指針操作
~~~
int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int *p = arr; //沒有&符號
p++; //這里將指針的地址+1 操作,就是向后移動了一個單元,4個字節的大小.也就是說此刻指針指向了數組中的第二個元素了
*p = 200;
for (int i = 0; i < 10; ++i) {
printf("%d\n", *(p + i));
}
printf("-----");
for (int i = 0; i < 10; ++i) {
printf("%d\n", arr[i]);
}
~~~
可以看到p的范圍越界了.因為p的地址已經發生了改變.其實這個指針跟數組已經沒有什么關系了,它跟野指針的效果是一樣的. 只不過它正好指向的值是數組中的地址而已.
```
200
3
4
5
6
7
8
9
10
-282591133 //越界
-----
1
200
3
4
5
6
7
8
9
10
```
### 例子1
~~~
int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int *p = arr;
p++;
*p = 100; //{1, 100, 3, 4, 5, 6, 7, 8, 9, 10};
p = 100; //野指針
// *p = 100; //非法操作野指針
p = &arr[9];
*p = 100; // {1, 100, 3, 4, 5, 6, 7, 8, 9, 100};
p--;
*p = 20; //{1, 100, 3, 4, 5, 6, 7, 8, 20, 10};
p = &arr[0];
*p += 100; //{101, 100, 3, 4, 5, 6, 7, 8, 20, 10};
p += 100;
int len = p - arr; //指針操作,一般不進行乘除,只使用加減
printf("len = %d\n",len); //在內存中相差400個,一共相差100個int的大小,也就是100
for (int i = 0; i < 10; ++i) {
printf("%d\n", arr[i]);
}
~~~
```
len = 100
101
100
3
4
5
6
7
8
20
100
```
### 例子2
~~~
int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int *p = arr;
p = &arr[9];
int len = p - arr;
printf("len = %d\n", len);
for (p = arr; p <= &arr[9]; ++p) {
printf("%d\n", *p);
}
~~~
```
len = 9
1
2
3
4
5
6
7
8
9
10
```