• 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. }

    指针中常见优先级排序

  • 相关阅读:
    tomcat动静分离和负载均衡
    Adobe产品2024
    八股文之mysql
    《数据结构、算法与应用C++语言描述》使用C++语言实现二维数组矩阵
    Java 局部类访问局部变量为什么必须添加 final 关键字
    Uniapp 文件选择插件 Ba-FilePicker
    Docker 之 高级篇
    超纯水如何除硼,除硼树脂技术分析
    Python基础--PART2
    大家介绍一篇学生选课系统的设计与实现
  • 原文地址:https://blog.csdn.net/2301_78772787/article/details/134024131