c指針深入理解--指針和数组

1、概念

  -》指针:

      int *p:指针,可以指向一维数组等等

  -》指针数组:

      int *p[5]:包含五个 int * 元素,即每个元素都是指针

      一维数组:

        int arr[5] = {1,2,3,4,5};

        p[0] = &arr;

        例子:访问第二个,*(*(p+0)+1)

  

 

  -》数组指针:

      int (*p)[5]:指向 五个连续地址的 int 元素(指向首元素地址),即每个元素都是普通的int类型数据

      一维数组:

        int arr[5] = {1,2,3,4,5};

        p = &arr;

        例子:访问第二个,*(*(p+0)+1)  

 

  总结:

    相同点:

      数组指针和指针数组都是指向二维维数组。指向一维数组的时候,可以当只有一行多列的二维数组来访问

    

    不同点:

      指针数组:指向数组的时候,需要指定具体那个元素(指针)指向一维数组

      数组指针:直接指向一维数组即可。

 

 

  注意:

    1)数组表示法和指针表示法的区别:

      例子:

          int arr[3] = {1,2,3};

          访问元素:arr[2] vs *(arr+2)  

            arr[1]:机器码从arr开始移动到2位置,再取出内容

            *(arr+2):机器码直接在跳到2位置,取出内容

      结论:

        1)数组表示法,效率会更低。相反,指针表示法,效率高

   2)数组名不能赋值

      延伸:不可以对数组名进行赋值,不可以对const修饰的左值赋值,不可以对string进行赋值

      例子:

        int arr[3] = {1,2,3},*p;

        p = arr;

          错误做法:

            arr = arr + 1;

            解析:数组名不是左值,不能被修改(这种解析感觉有点不专业,后续需研究修改)

          正确做法:

            p = arr + 1;

 

  3)二维数组访问:  

    int arr[3][7] = {1,2,3,4,5,6,7,
          8,9,10,11,12,13,14,
          15,16,17,18,19,20,21};

    地址偏移:*(arr+1)[1] 效果相当于  *(arr+2),偏移了两个行地址

    

 

posted @ 2022-01-04 11:39  dcli  阅读(61)  评论(0)    收藏  举报