当前位置:   article > 正文

C语言 指针高级应用_在c语言指针的使用场景

在c语言指针的使用场景

目录

一:函数指针

二:结构体指针[高级应用]

三:指针访问二维数组

四:函数指针 & 指针函数

五:指针的指针

六:无类型指针

七:const  常量指针 和 指针常量


一:函数指针

函数名就是函数的起始地址

函数指针的定义,示例如下:

  1. #include<stdio.h>
  2. int sum(int a,int b)//加
  3. {
  4. return a+b;
  5. }
  6. int muti(int a,int b)//乘
  7. {
  8. return a*b;
  9. }
  10. int substract(int a,int b)//减
  11. {
  12. return a-b;
  13. }
  14. void demoFunPoint()
  15. {
  16. //以上几个函数的返回相同 参数一致 数量类型
  17. //定义一个函数指针:复制函数首部 在函数返回后面+ *
  18. //仿照int(*substract)(int a,int b)定义一个函数指针如下
  19. int(*fun)(int a,int b)=NULL;
  20. }
  21. int main()
  22. {
  23. demoFunPoint();
  24. return 0;
  25. }

函数指针的使用,示例如下:

  1. #include<stdio.h>
  2. int sum(int a,int b)
  3. {
  4. return a+b;
  5. }
  6. int muti(int a,int b)
  7. {
  8. return a*b;
  9. }
  10. int substract(int a,int b)
  11. {
  12. return a-b;
  13. }
  14. void demoFunPoint()
  15. {
  16. int(*fun)(int a,int b)=sum;
  17. int res=fun(2,5);
  18. printf("%d\n",res);//7
  19. }
  20. int main()
  21. {
  22. demoFunPoint();
  23. return 0;
  24. }

函数指针数组的定义,示例如下:

  1. #include<stdio.h>
  2. int sum(int a,int b)
  3. {
  4. return a+b;
  5. }
  6. int muti(int a,int b)
  7. {
  8. return a*b;
  9. }
  10. int substract(int a,int b)
  11. {
  12. return a-b;
  13. }
  14. void demoFunPoint()
  15. {
  16. //函数指针数组的定义
  17. int (*funs[3])(int a,int b)={sum,substract,muti};//0 1 2
  18. int res=0;
  19. res=funs[1](5,2);//1是substract减
  20. printf("%d\n",res);//3
  21. //实际应用于:界面的切换
  22. }
  23. int main()
  24. {
  25. demoFunPoint();
  26. return 0;
  27. }

函数指针数组的实际应用【窗口界面的切换】:

  1. void proRun()
  2. {
  3. //函数指针数组的定义
  4. int (*win_funs[30])()={loginInit,adminInit};
  5. int winIndex = 0; //0-loginInit 1-adminInit
  6. while(1)
  7. {
  8. system("cls");
  9. winIndex = win_funs[winIndex]();
  10. }
  11. }

二:结构体指针[高级应用]

结构体指针的实际应用,如下,可以优化winRun函数

函数传参 WIN_T *win [结构体指针],函数内部改变,外部也可改变,无需return返回,直接设置void函数类型

函数声明:

  1. /*
  2. 函数名称:void winRun(WIN_T *win);
  3. 函数作用:窗口运行函数 光标定位 找到edit(输入) button控件(回车,做对应操作)
  4. 函数参数:参数 WIN_T *win 窗口结构体指针
  5. 函数返回:无
  6. */
  7. void winRun(WIN_T *win);

函数定义:

  1. /*
  2. 函数名称:void winRun(WIN_T *win);
  3. 函数作用:窗口运行函数 光标定位 找到edit(输入) button控件(回车,做对应操作)
  4. 函数参数:参数 WIN_T *win 窗口结构体指针
  5. 函数返回:无
  6. */
  7. void winRun(WIN_T *win)
  8. {
  9. int i=0,key=0;
  10. for(i=0;i<win->ctrlCount;i++)
  11. {
  12. if(win->ctrlArr[i].ctrlType==EDIT||win->ctrlArr[i].ctrlType==BUTTON)
  13. {
  14. gotoxy(win->ctrlArr[i].startx,win->ctrlArr[i].starty);
  15. break;
  16. }
  17. }
  18. while(1)
  19. {
  20. key=getkey();
  21. switch(key){
  22. case KEY_DOWN://向下按键 查找下一个编辑框 按钮
  23. i++;//按键数组下标越界
  24. if(i==win->ctrlCount)
  25. {
  26. i=0;//为了避免下标越界 从头开始对控件结构体数组找编辑框 按钮
  27. }
  28. for(;i<win->ctrlCount;i++)
  29. {
  30. if(win->ctrlArr[i].ctrlType==EDIT||win->ctrlArr[i].ctrlType==BUTTON)//如果找到编辑框 按钮
  31. {
  32. gotoxy(win->ctrlArr[i].startx,win->ctrlArr[i].starty);//光标目标定位
  33. break;//停止
  34. }
  35. }
  36. break;
  37. case KEY_UP:
  38. i--;
  39. if(i==-1) //从后往前找 数组起始0 i--为-1 数组下标由大到小 (控件数组下标0位置)
  40. {
  41. i=win->ctrlCount-1; //控件个数(控件结构体数组下标最大)-1 (控件数组下标ctrlCount位置)
  42. }
  43. for(;i>0;i--)
  44. {
  45. if(win->ctrlArr[i].ctrlType==EDIT||win->ctrlArr[i].ctrlType==BUTTON)//如果找到编辑框 按钮
  46. {
  47. gotoxy(win->ctrlArr[i].startx,win->ctrlArr[i].starty);//光标目标定位
  48. break;//停止
  49. }
  50. if(i==0) //第一个 若第一个不是编辑框 按钮
  51. {
  52. i=win->ctrlCount; //就从最后一个往前查找 for循环中有i--,不用再-1
  53. }
  54. }
  55. break;
  56. case KEY_ENTER:
  57. if(win->ctrlArr[i].ctrlType==BUTTON)
  58. {
  59. win->foucsIndex=i;
  60. return ;//获取winRun中输入的编辑框的值
  61. }
  62. break;
  63. default: //其他字符(不是按键)并且当前控件是编辑框
  64. if(win->ctrlArr[i].ctrlType==EDIT)
  65. {
  66. editKeyListen(win->ctrlArr[i],key,win->ctrlArr[i].content);
  67. }
  68. break;
  69. }
  70. }
  71. }

函数调用:

[需要 &取地址符]

	winRun(&loginWin);	

三:指针访问二维数组

重点:num[i]==*(num+i)恒等式

指针访问二维数组的两种方式: 

1. nums[i][j] 数组名[行下标][列下标] 

2. *(nums+i)[j]   *(数组名+偏移行)[列下标]

指针 数据类型 函数传参  声明如下:

int Jude(char *name,char *pwd,USER_T userArr[]);

其中char *name //字符数组    char *pwd //字符数组 使用char * 指针数控类型

数组的定义主要有三种写法

如:char *name 、 char name[长度]  、char name[ ]

四:函数指针 & 指针函数

函数指针:是 指针存储地址,实际应用如 窗口界面的切换

指针函数如下:

  1. //函数类型 int*作为返回
  2. int *getAdrress(int a)
  3. {
  4. return &a;//指针作为返回
  5. }

五:指针的指针

指针的指针,示例如下: 

示例一:研究地址 

  1. #include <stdio.h>
  2. void demo_point2() //指针的指针
  3. {
  4. int a=10;
  5. int *pa=&a; //指针变量存储别人的地址
  6. int **p=&pa;//指针变量也是变量,再指针变量存储别人的地址
  7. printf("%p\n",&a);// 变量a的地址 0019FED8
  8. printf("%p\n",pa);//指针变量pa存储a的地址 0019FED8
  9. printf("%p\n",&pa);//指针变量也是变量,也有地址,pa的取地址:0019FED4
  10. printf("%p\n",p); //再指针变量存储别人的地址,p存pa的地址 0019FED4
  11. }
  12. int main()
  13. {
  14. demo_point2();
  15. return 0;
  16. }

示例二:研究值 

  1. #include <stdio.h>
  2. void demo_point2() //指针的指针
  3. {
  4. int a=10;
  5. int *pa=&a;
  6. int **p=&pa;
  7. //pa的值就是a的地址,使用*取值(*p)得到a的地址
  8. printf("%p\n",*p); //先获取变量a的地址 0019FED8
  9. printf("%d\n",*(*p));//再取值,获取变量a的值 10
  10. }
  11. int main()
  12. {
  13. demo_point2();
  14. return 0;
  15. }

一个*是指针变量的地址,再来个*取值获取地址,再获取到最开始定义的值

void fun(char **name); //指针的指针
  1. char* name = "lily";//指针变量是变量,也有地址。
  2. char** name;//再对指针变量取值获取最终定义lily的地址进而获取lily(值)

指针的指针,使用场景:

在函数传参中,字符指针数组作为函数形参,如

void fun(char **name);   其中的char **name就是指针的指针

六:无类型指针

无类型指针定义如: void *p;

可以将任意类型的指针赋给无类型指针,但不能将无类型指针赋给其他类型指针,示例如下:

  1. #include <stdio.h>
  2. void demo_void()//无类型指针
  3. {
  4. void *p=NULL;
  5. int a=10;
  6. int *pa=&a;
  7. p=pa; //可以 无类型指针接收任意类型的指针
  8. // pa=p; //不可以 但VC不报错 void*不能直接赋值给确定类型的指针
  9. }
  10. int main()
  11. {
  12. demo_void();
  13. return 0;
  14. }

确定类型的指针,使用数据类型强制转换,示例如下:

  1. #include <stdio.h>
  2. void demo_void()//无类型指针
  3. {
  4. void *p=NULL;
  5. int a=10;
  6. int *pa=&a;
  7. //数据类型强制转换
  8. pa=(int*)malloc(sizeof(int)); //程序员操作的堆区
  9. printf("%p\n",pa);//02247DC8 比较特殊 随机开辟空间 每次获取的地址都不同
  10. }
  11. int main()
  12. {
  13. demo_void();
  14. return 0;
  15. }

无类型指针的使用场景:void* 函数的返回,增加函数的通用性

memset的作用:为新申请的内存做初始化工作

七:const  常量指针 和 指针常量

const:修饰变量,不可以再被赋值

使用场景:不允许修改的变量或形式参数

对于strcpy()函数 可以去查看它的定义:char*, const char* 数据保护 (实际应用如抢票活动,票若是被抢完了就用户就不能再购买了)

const int num=10; //无法改变的量 值是唯一的 不能再被赋值

常量指针:地址可以修改,值不可以修改,示例如下:

  1. #include <stdio.h>
  2. void demo_const()
  3. {
  4. int a=10,b=20;
  5. const int*p=&a; //const右边的内容不能变 常量指针
  6. // int const *p=&a;//是同上面等价的
  7. // p=NULL; //(指针的值)地址可修改,不能通过指针修改别人的值 NULL是void*
  8. p=&b; //(指针的值)地址可修改,不能通过指针修改别人的值
  9. // *p=100; // 不可以 (指针的值)地址可修改,不能通过指针修改别人的值,会报错
  10. }
  11. int main()
  12. {
  13. demo_const();
  14. return 0;
  15. }

指针常量:值可以修改,地址不可以修改,示例如下:

  1. #include <stdio.h>
  2. void demo_const()
  3. {
  4. int a=10,b=20;
  5. int *const pa=&a; //指针常量
  6. // pa=&b; //不可以,地址不可以改,会报错
  7. *pa=100; //值可以修改
  8. }
  9. int main()
  10. {
  11. demo_const();
  12. return 0;
  13. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/587727
推荐阅读
相关标签
  

闽ICP备14008679号