企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持知识库和私有化部署方案 广告
### 数组 数组名是数组的首地址,这是一个常量. ~~~ 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 ```