• C语言:指针数组与数组针的应用


    指针数组:

       本质上是一个数组,只不过这个数组里面每一个元素都是指针

       一般形式:

       <数据类型> *<数组名>[下标];

       下标代表数组有多少个元素

      

       int a = 1, b = 2, c = 3, d = 4, e = 5;

       int *arr[5] = {&a, &b, &c, &d, &e};

    指针数组和一维数组的联系:

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

       int *arr[5] = {a, a+1, a+2, a+3, a+4}

       char a[] = "hello", b[] = "world", c[] = "welcome";

       char *str[3] = {a, b, c};

       puts(str[0])

    代码:

    1. #include
    2. #include
    3. #include
    4. void ptr_arr(int a[],int n)
    5. {
    6. for(int i=1;i
    7. {
    8. printf("%d ",a[i]);
    9. }
    10. puts("");
    11. }
    12. int main(int argc, char *argv[])
    13. {
    14. int a[]={1,2,23,5,6,7};
    15. int n=sizeof(a)/sizeof(int);
    16. ptr_arr(a,n);
    17. return 0;
    18. }

    指针数组和二维数组的联系:

       int a[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};

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

      

       for(int i = 0; i < 3; i++){

         for(int j = 0; j < 4; j++){

            printf("%d ", *(arr[i]+j)); //printf("%d ", arr[i][j])); //printf("%d ", *(*(arr+i)+j));

         }

         puts("");

       }

      

    数组指针:

       本质上是一个指针,只不过这个指针指向的是整个数组

       一般形式:

       <数据类型> (*<数组指针变量名>)[下标];

       下标代表要指向的数组的元素个数

       int a[3] = {1,2,3}, b[4] = {1,2,3,4};

       int (*p)[3] = &a; //p == &a --> *p == a

       for(int i = 0; i < 3; i++){

        printf("%d ", (*p)[i]); //(*p)[i] == *(*p+i) == p[0][i]

       }

      

    数组指针和二维数组的关系:

       二维数组数组名是行地址也是行指针

     

    1. int a[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
    2.    //a的类型:int (*)[4]
    3.    int (*p)[4] = a; //a == &&a[0][0]
    4.    for(int i = 0; i < 3; i++){
    5.      for(int j = 0; j < 4; j++){
    6.         printf("%d ", *(*(p+i)+j)); // *(*(p+i)+j) == *(p[i]+j) == p[i][j] == (*(p+i))[j]
    7.      }
    8.      puts("");
    9.    }

      

    1. #include
    2. #include
    3. #include
    4. int main(int argc, char *argv[])
    5. {
    6. int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
    7. int(*p)[4]=a;
    8. int i,j;
    9. int max=a[0][0];
    10. for(i=0;i<3;i++)
    11. {
    12. for(j=0;j<4;j++)
    13. {
    14. printf("%d ",*(*(p+i)+j));
    15. if(max
    16. max=*(*(p+i)+j);
    17. }
    18. }
    19. puts("");
    20. printf("max=%d\n",max);
    21. return 0;
    22. }

    二级指针和二维数组没有直接关系

    void *:

       任意类型的指针

       在使用时,需要强转为具体类型的指针

       const int a = 10;

       int *p = (int *)&a;

       const int *p

       int *const p

       const int *const p

    1. #include
    2. #include
    3. #include
    4. int main(int argc, char *argv[])
    5. {
    6. char a=65;
    7. short b=123;
    8. int c=45;
    9. void *p;
    10. p=&a;
    11. printf("%c\n",*(char *)p);
    12. return 0;
    13. }

    函数:

       具有特定功能的代码模块

       一般形式:

       <数据类型> <函数名>(形参列表)

       {

         函数体;

         return;

       }

       int add(int a, int b)

       {

         return a+b;

       }

       int sum = add(1,2);

        函数的值传递:

         直接赋值操作

        函数的地址传递:

         是把需要修改的实参的地址传递进去

    void ptr_arr(int a[], int n)

    {

       //int len = sizeof(a)/sizeof(a[0]); //err

       //a是指针

       for(int i = 0; i < n; i++){

         printf("%d ", a[i]);

       }

       puts("");

    }

    int get_max(int c, int (*a)[c], int b);

    int get_max(int m, int n, int a[][n]);

    指针函数:

       本质上是一个函数,只不过函数返回的是一个地址

       一般形式:

       <数据类型> *<函数名>(形参列表)

       {

         函数体;

         return;

       }

       注意:

         不能返回局部变量的地址,因为函数调用结束,局部变量全部被销毁

        

    函数指针:

       本质上是一个指针,只不过该指针指向一个函数

       一般形式:

       <数据类型> (*<函数指针名>)(形参列表);

    1. #include
    2. #include
    3. #include
    4. int add(int a,int b)
    5. {
    6. return a+b;
    7. }
    8. int sub(int a,int b)
    9. {
    10. return a-b;
    11. }
    12. int main(int argc, char *argv[])
    13. {
    14. // int (*p)(int, int);
    15. typedef int (*Pfun)(int,int); //int(*p)(int,iny)取别名
    16. Pfun p;
    17. p = add; //让指针指向函数
    18. printf("%d \n",p(1,2));
    19. printf("%d \n",(*p)(1,2));
    20. p = sub;
    21. printf("%d \n",p(1,2));
    22. printf("%d \n",(*p)(1,2));
    23. return 0;
    24. }

  • 相关阅读:
    数字图像处理(十二)最大熵算法
    Spring Boot(七十八):实现API 多版本控制
    学生Dreamweaver静态网页设计 基于HTML+CSS+JavaScript制作简食餐厅美食网站制作
    【科普向】5G核心网架构和关键技术
    【办公类-22-14】周计划系列(5-5)“周计划-05 周计划表格内教案部分“节日”清空改成“节日“” (2024年调整版本)Win32
    非零基础自学Java (老师:韩顺平) 第5章 程序控制结构 5.8 while循环控制 && 5.9 do..while循环控制
    Qt+FFmpeg仿VLC接收RTSP流并播放
    【ESP 保姆级教程】疯狂Node.js服务器篇 —— 服务端口占用问题
    HTML+CSS+JS鲜花商城网页设计期末课程大作业 web前端开发技术 web课程设计 网页规划与设计
    Antd Vue a-select placeholder不显示问题
  • 原文地址:https://blog.csdn.net/qq_63626307/article/details/126325815