• c语言中各类指针的总结


    1、数组指针

    在c语言中,指针常被用于应用数组,或者作为数组的元素。顾名思义,指向数组的指针常被简称为数组指针。值得注意的是,数组指针指向的数组是数组名,也是其数值中首元素的地址。

    我们定义数组指针的方式如下:int (*p){n}={};(n为数组中的元素个数)

    代码展示如下:

    1. #include
    2. int main()
    3. {
    4. int a[3][4]={{22,23,42,66},{43,54,6,788},{9,56,78,38}};
    5. int i,j;
    6. int (*p)[4];//定义一个列为4的二维数组指针
    7. p = a;
    8. for(i=0;i<3;i++)
    9. {
    10. for(j=0;j<4;j++)
    11. {
    12. printf("%d ",*(*(p+i)+j));//跟*(*(a+i)+j)输出结果一样
    13. }
    14. }
    15. return 0;
    16. }

    其中p为二维数组首地址,*(p+i)为行的首地址,*(p+i)+j为列的首地址,*(*(p+i)+j)为i行i列的值。

    2、指针数组

    指针数组可以说成是”指针的数组”,首先这个变量是一个数组,其次,”指针”修饰这个数组,意思是说这个数组的所有元素都是指针类型。指针数组中的每一个元素都存放着一个地址,就是一个指针变量。

    我们定义指针数组的方式如下:int *p[n]={};(n为数组中的元素个数)

    这里[ ]优先级大于*,所以p先与[ ]结合为一个数组,再与*结合为指针数组。

    代码展示如下:

    1. #include
    2. int main()
    3. {
    4. int a=10;
    5. int b=20;
    6. int c=30;
    7. int* p[3]={&a,&b,&c};
    8. for(int i=0;i<3;i++)
    9. {
    10. printf("%d ",*p[i]);
    11. }
    12. return 0;
    13. }

    3、函数指针

    如果在程序中定义了一个函数,在编译时系统会为这个函数代码分配一段存储空间,这段存储空间的首地址称为这个函数的地址,即函数指针。

    注意:函数名表示地址

    我们定义函数指针的方式如下:int (*p)(int ,int )={};

    代码展示如下:

    1. #include
    2. #include
    3. int getMax(int data1,int data2)
    4. {
    5. int max;
    6. max=data1>data2?data1:data2;
    7. return max;
    8. }
    9. int getMin(int data1,int data2)
    10. {
    11. int min;
    12. min=data1
    13. return min;
    14. }
    15. int getSum(int data1,int data2)
    16. {
    17. int sum;
    18. sum=data1+data2;
    19. return sum;
    20. }
    21. int getResult(int data1,int data2,int (*c)(int data1,int data2))
    22. {
    23. int ret;
    24. ret=(*c)(data1,data2);
    25. return ret;
    26. }
    27. int main()
    28. {
    29. int a=10;
    30. int b=20;
    31. int cmd;
    32. int result;
    33. int (*c)(int a,int b);
    34. printf("请输入1(最大值),2(最小值),3(两数之和)\n");
    35. scanf("%d",&cmd);
    36. switch(cmd)
    37. {
    38. case 1:
    39. c=getMax;
    40. break;
    41. case 2:
    42. c=getMin;
    43. break;
    44. case 3:
    45. c=getSum;
    46. break;
    47. default:
    48. puts("输入错误!");
    49. exit(-1);
    50. }
    51. result=getResult(a,b,c);
    52. printf("最终输出结果是%d\n",result);
    53. return 0;
    54. }

    4、函数指针数组

    函数指针数组顾名思义就是函数指针与指针数组的结合。

    我们定义函数指针数组的方式如下:int (*p)(int ,int )={};

    代码展示如下:

    1. #include
    2. #include
    3. int getMax(int data1, int data2)
    4. {
    5. return data1>data2 ? data1:data2;
    6. }
    7. int getMin(int data1, int data2)
    8. {
    9. return data1
    10. }
    11. int getSum(int data1, int data2)
    12. {
    13. return data1+data2;
    14. }
    15. int main()
    16. {
    17. int a = 10;
    18. int b = 20;
    19. int ret;
    20. int (*pfunc[3])(int , int )={
    21. getMin,
    22. getMax,
    23. getSum};
    24. for(int i=0;i<3;i++){
    25. ret = (*pfunc[i])(a,b);
    26. printf("ret = %d\n",ret);
    27. }
    28. return 0;
    29. }

    5、指针函数

    指针函数实质是一个函数。函数都有返回类型(如整型值、字符值、实型值等),只不过指针函数返回类型是某一类型的指针。

    我们定义指针函数的方式如下:int *p(int ,int )={};

    这里()的优先级大于*,所以p先于()结合成一个函数,再与*结合成指针函数。

    代码展示如下:

    1. #include
    2. int* getPosPerson(int pos, int (*pstu)[4])//指针函数,返回指针的函数
    3. {
    4. int *p;
    5. p = (int *)(pstu+pos);//第pos行的所有数
    6. return p;
    7. }
    8. int main()
    9. {
    10. int scores[3][4]={
    11. {55,66,77,88},
    12. {66,55,99,100},
    13. {11,22,33,59},
    14. };
    15. int *ppos;
    16. int pos;
    17. printf("请输入你需要看的学生号数:0,1,2\n");
    18. scanf("%d",&pos);
    19. ppos = getPosPerson(pos, scores);
    20. for(int i=0;i<4;i++){
    21. printf("%d ",*ppos++);
    22. }
    23. return 0;
    24. }

    指针中常见优先级排序

  • 相关阅读:
    【AI语言大模型】星火使用介绍
    SpringCloud - Config分布式配置中心
    【Ubuntu】解压 tar.xz 类型文件
    mysql索引部分总结
    21、Java 中接口的基本使用
    Altium Designer20 批量修改元件丝印大小和位置
    计算机毕设之基于Hadoop+springboot的物品租赁系统的设计与实现(前后端分离,内含源码+文档+教程)
    【Mysql学习笔记】关键字顺序以及执行顺序
    Excel下拉填充时,如何使得数字不递增?
    Java程序设计2023-第二次上机测试
  • 原文地址:https://blog.csdn.net/2301_78772787/article/details/134024131