• c语言一维数组和二维指针


    c语言指针中,一维指针比较容易懂,但是遇到二维指针,有时侯就会不知道怎么给指针赋值了。

    1、一维指针

    通常是用来指向“数据块”的某个存储单元,它的值就是“那个存储单元的地址”。

    特点:直接指向存储单元

    如:

    char MyArray[5];

    char *p1;  //声明一维指针变量p1

    p1=&MyArray[4];

    //使用p1指针指向"MyArray[4]"

    //这样“p1的值”等于“MyArray[4]的地址”,而一维指针变量p1的地址是由系统分配的。

    printf("MyArray[4] =%d\r\n",*p1); //打印"所指向的数据值"

    printf("p1 =0x%p\r\n",p1); //打印p1的值

    printf("The address of p1 =0x%p\r\n",&p1); //打印“指针变量p1”的地址

    2、二维指针

    二维指针通常是用来指向“一维指针的地址”,间接指向数据块的某个存储单元。这个“一维指针的地址”就是这个二维指针的值,“这个二维指针变量的地址”是由系统分配的;

    特点:间接指向存储单元

    char MyArray[5];

    char *p1;  //声明一维指针变量p1

    char **p2; //声明二维指针变量p2

    p1=&MyArray[4];  //使用p1指针指向"MyArray[4]"

    p2=&p1; //将p1指针变量的地址保存到p2中

    printf("MyArray[4] =%d\r\n",*p1); //打印"p1所指向的数据值"

    printf("MyArray[4] =%d\r\n",**p2); //打印"p2所指向的数据值"

    printf("p1 =0x%p\r\n",p1); //打印p1的值,即"MyArray[4]"的地址

    printf("*p2 = 0x%p\r\n",*p2);//打印p2的"指针值",即"MyArray[4]"的地址

    printf("The address of p1 =0x%p\r\n",&p1); //打印“指针变量p1”的地址

    printf("The value of p2 is 0x%p\r\n\r\n",p2);//打印p2的值,即"指针变量p1"的地址

    3、三维指针

    三维指针通常是用来指向“二维指针的地址”。

    特点:间接一次后,再间接指向存储单元

    char MyArray[5];

    char *p1;  //声明一维指针变量p1

    char **p2; //声明二维指针变量p2

    char ***p3; //声明三维指针变量p3

    p1=&MyArray[4];  //使用p1指针指向"MyArray[4]"

    p2=&p1; //将p1指针变量的地址保存到p2中

    p3=&p2; //将p2指针变量的地址保存到p3中

    printf("MyArray[4] =%d\r\n",*p1); //打印"p1所指向的数据值"

    printf("MyArray[4] =%d\r\n",**p2); //打印"p2所指向的数据值"

    printf("MyArray[4] =%d\r\n",***p3); //打印"p3所指向的数据值"

    printf("p1  = 0x%p\r\n",p1);//打印p1的值

    printf("*p2 = 0x%p\r\n",*p2);//打印*p2"的值"

    printf("**p3 = 0x%p\r\n\r\n",**p3);//打印**p3"的值"

    4、测试程序

    #include

    //函数功能:打印数组数据

    void Print_MyArray(int *array, int size)

    {

      int i;

    //打印数组开始/

      for(i=0;i

      {

        printf("MyArray[%d]=%d",i,array[i]);

        if(i!=4) printf(", ");

        else printf("\r\n");

      }

    //打印数组结束/

    }

    //c语言一维数组,二级指针和三级指针

    int main(int argc,char *argv[])

    {

      int i;

      int MyArray[5];

      int *p1;

      int **p2;

     // int **p2=&p1;//在声明变量时,可以这么赋值

      int ***p3;

      for(i=0;i<5;i++)//修改数组中的数据

      {

        MyArray[i]=i+1;

      }

      Print_MyArray(MyArray,5);//打印数组数据

      p1=MyArray;

      for(i=0;i<5;i++)//修改数组中的数据

      {

        *p1=*p1+1;//修改数组的值

        p1++;  //这里是修改p1的值,但指针变量p1的地址是保持不变的

      }

      Print_MyArray(MyArray,5);//打印数组数据

      p1=MyArray;//使用p1指针指向"MyArray[]"

      p2=&p1;//将p1指针变量的地址保存到p2中

      for(i=0;i<5;i++)//修改数组中的数据

      {

        **p2=**p2+1;//"**p2"是"*p2"指向的存储数据

        (*p2)++;

         //这里需要用小括号

         //这里是修改p1的值,但指针变量p1和p2的地址是保持不变的

      }

      Print_MyArray(MyArray,5);//打印数组数据

      p1=MyArray;//使用p1指针指向"MyArray[]"

      p2=&p1;//将p1指针变量的地址保存到p2中

      p3=&p2;//将p2指针变量的地址保存到p3中

      for(i=0;i<5;i++)//修改数组中的数据

      {

        ***p3=***p3+1;//"***p3"是"**p3"指向的存储数据

        (**p3)++;

        //这里需要用小括号

       //这里是修改p1的值,但指针变量p1,p2和p3的地址是保持不变的

      }

      Print_MyArray(MyArray,5);//打印数组数据

      p1=&MyArray[4];//使用p1指针指向"MyArray[4]"

      p2=&p1;//将p1指针变量的地址保存到p2中

      p3=&p2;//将p2指针变量的地址保存到p3中

      printf("*p1 =%d\r\n",*p1);

      printf("**p2=%d\r\n",**p2);

      printf("***p3=%d\r\n\r\n",***p3);

      printf("The first address of MyArray[] =0x%p\r\n",MyArray);

      printf("p1  = 0x%p\r\n",p1);//打印p1的值

      printf("*p2 = 0x%p\r\n",*p2);//打印p2的"指针值"

      printf("**p3 = 0x%p\r\n\r\n",**p3);//打印p3的"指针值"

      printf("The address of p1 is 0x%p\r\n",&p1);//打印"指针变量p1"的地址

      printf("The value of p2 is 0x%p\r\n\r\n",p2);//打印p2的值

      printf("The address of p2 is 0x%p\r\n",&p2);//打印"指针变量p2"的地址

      printf("The value of p3 is = 0x%p\r\n\r\n",p3);//打印p3的值

      return 0;

    }

    1. #include <stdio.h>
    2. //函数功能:打印数组数据
    3. void Print_MyArray(int *array, int size)
    4. {
    5. int i;
    6. //打印数组开始/
    7. for(i=0;i<size;i++)
    8. {
    9. printf("MyArray[%d]=%d",i,array[i]);
    10. if(i!=4) printf(", ");
    11. else printf("\r\n");
    12. }
    13. //打印数组结束/
    14. }
    15. //c语言一维数组和二级指针
    16. int main(int argc,char *argv[])
    17. {
    18. int i;
    19. int MyArray[5];
    20. int *p1;
    21. int **p2;
    22. // int **p2=&p1;//在声明变量时,可以这么赋值
    23. int ***p3;
    24. for(i=0;i<5;i++)//修改数组中的数据
    25. {
    26. MyArray[i]=i+1;
    27. }
    28. Print_MyArray(MyArray,5);//打印数组数据
    29. p1=MyArray;
    30. for(i=0;i<5;i++)//修改数组中的数据
    31. {
    32. *p1=*p1+1;//修改数组的值
    33. p1++;
    34. }
    35. Print_MyArray(MyArray,5);//打印数组数据
    36. p1=MyArray;//使用p1指针指向"MyArray[]"
    37. p2=&p1;//将p1指针变量的地址保存到p2
    38. for(i=0;i<5;i++)//修改数组中的数据
    39. {
    40. **p2=**p2+1;//"**p2"是"*p2"指向的存储数据
    41. (*p2)++;
    42. //这里需要用小括号
    43. //这里是修改p1的值,但指针变量p1和p2的地址是保持不变的
    44. }
    45. Print_MyArray(MyArray,5);//打印数组数据
    46. p1=MyArray;//使用p1指针指向"MyArray[]"
    47. p2=&p1;//将p1指针变量的地址保存到p2
    48. p3=&p2;//将p2指针变量的地址保存到p3
    49. for(i=0;i<5;i++)//修改数组中的数据
    50. {
    51. ***p3=***p3+1;//"***p3"是"**p3"指向的存储数据
    52. (**p3)++;
    53. //这里需要用小括号
    54. //这里是修改p1的值,但指针变量p1,p2和p3的地址是保持不变的
    55. }
    56. Print_MyArray(MyArray,5);//打印数组数据
    57. p1=&MyArray[4];//使用p1指针指向"MyArray[4]"
    58. p2=&p1;//将p1指针变量的地址保存到p2
    59. p3=&p2;//将p2指针变量的地址保存到p3
    60. printf("*p1 =%d\r\n",*p1);
    61. printf("**p2=%d\r\n",**p2);
    62. printf("***p3=%d\r\n\r\n",***p3);
    63. printf("The first address of MyArray[] =0x%p\r\n",MyArray);
    64. printf("p1 = 0x%p\r\n",p1);//打印p1的值
    65. printf("*p2 = 0x%p\r\n",*p2);//打印p2"指针值"
    66. printf("**p3 = 0x%p\r\n\r\n",**p3);//打印p3"指针值"
    67. printf("The address of p1 is 0x%p\r\n",&p1);//打印"指针变量p1"的地址
    68. printf("The value of p2 is 0x%p\r\n\r\n",p2);//打印p2的值
    69. printf("The address of p2 is 0x%p\r\n",&p2);//打印"指针变量p2"的地址
    70. printf("The value of p3 is = 0x%p\r\n\r\n",p3);//打印p3的值
    71. return 0;
    72. }

     5、程序运行结果:

    6、总结

    一维指针可以直接指向某个存储单元

    二维指针必须通过一维指针这个桥梁,才可以到达指向某个存储区;因此,只能间接指向某个存储单元。 

    三维指针,必须经过二维指针和一维指针,也是通过桥梁的方式,才可以访问某个存单元。

     

      p1=MyArray;//使用p1指针指向"MyArray[]"

      p2=&p1;//将p1指针变量的地址保存到p2中

      p3=&p2;//将p2指针变量的地址保存到p3中

      for(i=0;i<5;i++)

      {

        printf("p1  = 0x%p\r\n",p1);//打印p1的值

        printf("*p2 = 0x%p\r\n",*p2);//打印"p2指向p1的值"

        printf("**p3 = 0x%p\r\n",**p3);//打印"p3指向p1的值"

        printf("&p1  = 0x%p\r\n",&p1);//打印p1的地址

        printf("p2  = 0x%p\r\n",p2);//打印p2的值,即p1的地址

        printf("*p3 = 0x%p\r\n",*p3);//打印"p3指向p1的地址"

        printf("&p2  = 0x%p\r\n",&p2);//打印p2的地址

        printf("p3  = 0x%p\r\n\r\n",p3);//打印p3的值,即p2的地址

        (**p3)++;//这里需要用小括号,读取p1的值,然后修改p1的值

        //这里是修改p1的值,但指针变量p1,p2和p3的地址是保持不变的

      }

  • 相关阅读:
    mac苹果电脑使用耳机听不到声音
    实用新型专利的特点是什么
    【MySQL】表的增删改查
    Linux IPTables Flush:删除/删除 RedHat 和 CentOS Linux 上的所有规则(转载)
    Mongodb----部署副本集 实现读写分离
    C/C++ Qt 标准Dialog对话框组件应用
    哪个牌子的电容笔好用?ipad触控笔推荐平价
    RocketMq:响应码列表,code=11
    MQ和redis的内部原理一些总结
    消息队列——rabbitmq的不同工作模式
  • 原文地址:https://blog.csdn.net/weixin_42550185/article/details/133999522