### 数组
数组名是数组的首地址,这是一个常量.
~~~
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
```
