皓月星空

导航

数组与指针的结合

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)

posted on 2021-05-09 14:48  皓月星空  阅读(169)  评论(0编辑  收藏  举报