1.
int main(int argc, char const *argv[])
{
int arr [5] = {0,1,2,3,4};
int *p1 = &arr[0]; //P1指针表示指向arr数组的首地址
int *p2 = arr; //P2是数组首元素的地址
printf("%d\n",*p1);//取数组首元素的值
printf("%p\n\n",p1); //获取数组的地址值
printf("%d\n",*(p1 +1));//小括号优先级高,指针移动一个int的位置,然后取值
printf("%d\n",*p1 +10);//*优先级高,先获取数组的首元素的值为0,然后再+10
printf("%d\n\n",*(p1 +10));//指针越界,指针移动10个int到了未知的地址,获取到随机值
printf("%p\n",p2 );
printf("%p\n",p2 +1);//指针移动一个int
printf("%d\n",*p2 +1);//*p2获取到数组的第一个元素的值,为0;再+1等于1
return 0;
}
2.数组指针,专门用来指向数组的指针
#include <stdio.h>
int main(int argc, char const *argv[])
{
//int *p; //定义一个名为p的指针
//int (*p )[5] ;//该指针指向的类型为int [5],一个拥有五个元素的整型数组
int arr [5] = {1,2,3,4,5};
int (*p)[5] = &arr; //表示该指针指向arr数组的地址
printf("%p\n",arr);
printf("%p\n",*p); //两个都是获取数组的首地址
printf("%p\n",*(p+1));//相当于获取数组中第二根元素的地址
printf("%d\n",(*p)[1]);//写成与定义一致来获取该数组中的第二个值
printf("%p------%d\n",p+1,(*(p+1)[2]));//越界访问
return 0;
}
3.指针数组,专门用来存放指针的数组,就是指针数组
#include <stdio.h>
int main(int argc, char const *argv[])
{
int a = 1;
int b = 2;
int c = 3;
int d = 4;
int f = 5;
int *p[10] = {&a,&b,&c,&d,&f,};
for(int i = 0; i < 5;i++)
{
printf("%d\n",*p[i]);//获取5个数组的值
printf("%p\n",p[i]);// 获取5个值对应的地址
}
printf("%p\n",p[6]); //输出nil
printf("%d\n",*p[6]);//输出段错误,该数组第六个没有存放的地址,获取不到值
return 0;
}
![](https://img2020.cnblogs.com/blog/1742419/202105/1742419-20210509155532603-750112722.png)