当前位置:   article > 正文

嵌入式学习笔记十五——指针操作数组和函数

嵌入式学习笔记十五——指针操作数组和函数

1.指针操作二维字整型数组

        假设有:

  1. int a[4][4] = {1,4,5,6,2,7,8,13,14,3,9,11,10,15,16,12};
  2. int (*p)[4] = a;

        我们先看下面的代码:

  1. printf("p = %p\n",p);// a[0]的地址,代表a这一行
  2. printf("p + 1 = %p\n",p+1);//a[0]的下一个地址,a[1]的地址,代表这 a[1]一行。
  3. printf("(p+1)+1 = %p\n",(p+1)+1);//a[2]这一行的地址
  4. printf("*(p+1) = %p\n",*(p+1));//a[1][0]的地址
  5. printf("*(p+1)+1 = %p\n",*(p+1)+1);//a[1][1]的地址

        可以发现:二维数组a的指针p,p与*p的意义并不一样。p与*p都是地址,p指向一行的地址,p+1指向下一行;*p代表数组一个元素的地址,*(p+1)则指向下一个元素。如果要取地址指向空间的数据内容,需要**p,*p指向一个元素,**p访问地址数据内容。int a[4][4]一行是十六个字节,一个元素是四个字节,如果没搞懂可以运行这段代码,得到的结果都是地址,根据结果来进行理解。

注意:  

         二维数组的操作是从二维数组的本质进行的 ,二维数组的本质一维数组的一维数组,直接的访问操作也是 一维一维的展开

练习: 实现一个函数,找出二维数组中能被3整除的数。代码如下:

  1. void find3Mul(int (*a)[4],int row)
  2. {
  3. int i = 0;
  4. int j = 0;
  5. for (i = 0;i < row;++i)
  6. {
  7. for (j = 0;j < 4;++j)
  8. {
  9. if( *(*(a+i)+j)%3 == 0)
  10. printf("%d ",*(*(a+i)+j));
  11. }
  12. }
  13. putchar('\n');
  14. }

2.指针操作二维字符型数组

        假设有:

  1. char s[][10] = {"hello","world","china"};
  2. char (*p)[10] = s; //p指向二维数组s

        二维字符型数组与整型不同,二维字符型数组用来处理字符串,指针p指向s,p表示s的地址,p等价于s[0]的地址,代表s[0]这一行的字符串的地址,p+1等价于下一行字符串的地址,*p则代表s[0]中存放的字符串。在这一点上,二维字符串型数组与二维整型数组不同,不要搞混。

练习:输入三个字符串 ,排序输出(用函数和指针)。代码如下:

  1. //插入排序
  2. void sort(char (*s)[10],int row)
  3. {
  4. int i = 0;
  5. int j = 0;
  6. char t[10];
  7. for (i = 0;i < row-1;++i)
  8. {
  9. for (j = i+1;j < row;j++)
  10. {
  11. if (strcmp(*(s+i),*(s+j)) > 0)
  12. {
  13. strcpy(t,*(s+i));
  14. strcpy(*(s+i),*(s+j));
  15. strcpy(*(s+j),t);
  16. }
  17. }
  18. }
  19. }

3.指针数组

        假设有

  1. char s[10] = "hello";//存放字符串数据
  2. char *p = "hello";

        先思考s[10]和p的区别,不难发现:s是一维数组,存放了一个字符串,p是地址,指向了一个字符串。s的数据存放在栈上,p是指向了一个字符串常量,字符串常量的数据储存在字符串常量区,不能被修改。p的类型 是char *  既char *类型的指针变量p ,相当于代表一个字符串 

  1. char *p1 = "hello";
  2. char *p2 = "world";
  3. char *p3 = "china";

        p1、p2、p3都是指针,我们把这些指针写成一个数组

  1. char* pstr[3]= {"hello","world","china"}; //数组 --- 数组中存放是 各个字符串的地址
  2. //地址 ---存放这地址数据的数组 --- 指针的数组 ---指针数组

   这个数组中存放是 各个字符串的地址,是存放地址数据的数组是指针的数组,我们称为指针数组

注意:这是一个一维的指针数组,不要与二维字符型数组搞混。

如果要在函数中调用这个指针呢个数组,形参该如何表示?

  根据之前学的指针处理一维数组的知识,如果有int a[3],形参可以设置为int型指针:int *p。char * qstr[3]是char* 型数组,所以,形参应该设置为char * 型指针:char * *p。还需要传入行数int row。**q = pstr; //q 二级指针。

练习:

1.找出字符串中最大值     
2.实现字符串逆序 
3.排序 

  1. char* maxOfStr(char * *p,int len)
  2. {
  3. //char max[10];
  4. char *max = *p;
  5. int i = 0;
  6. for (i = 1; i < len; ++i)
  7. {
  8. if (strcmp(max,*(p+i)) < 0)
  9. {
  10. max = *(p+i);
  11. }
  12. }
  13. return max;
  14. }
  15. void reverseStr(char **begin, char **end)
  16. {
  17. while (begin < end)
  18. {
  19. char *t = *begin;
  20. *begin = *end;
  21. *end = t;
  22. begin++;
  23. end--;
  24. }
  25. }
  26. void bubbleSort(char **p,int len)
  27. {
  28. int i = 0;
  29. int j = 0;
  30. for (i = len-1; i > 0; --i)
  31. {
  32. for (j = 0; j < i; ++j)
  33. {
  34. if (strcmp(*(p+j),*(p+j+1)) > 0)
  35. {
  36. char *t = *(p+j);
  37. *(p+j) = *(p+j+1);
  38. *(p+j+1) = t ;
  39. }
  40. }
  41. }
  42. }
  43. int main(void)
  44. {
  45. const char *p[] = {"hello","world","china"};
  46. //printf("sizeof(p) = %ld\n",sizeof(p));
  47. //char* *q = p;
  48. printStr(p,3);
  49. //printf("max = %s\n",maxOfStr(p,3));
  50. //reverseStr(p,p+2);
  51. bubbleSort(p,3);
  52. printStr(p,3);
  53. return 0;
  54. }

4.指针处理函数

既通过指针的方式 来调用函数 

int add(int a,int b) // 函数  

1.函数名 - 代表函数的入口地址 
2.add函数名对应的数据类型 int (int a,int b) 函数类型 
3.int(int a,int b)代表返回值为int型 带有两个int型的形参变量一类函数            

说明:
 1.可以定义一个函数类型的指针变量 来保存函数的入口地址 
 2.有了这个指针变量 通过指针变量 进行函数调用

c语言中,使用了 函数指针 实现回调 

练习:
    写一个程序 实现加,减,乘,除
    以回调函数的形式,打印对应的结果 
    void processData(int a,int b, int (*pfunc)(int,int))
    {
        printf();
    }

代码如下:

  1. #include<stdio.h>
  2. int add(int a,int b)
  3. {
  4. return a+b;
  5. }
  6. int sub(int a,int b)
  7. {
  8. return a-b;
  9. }
  10. int mul(int a,int b)
  11. {
  12. return a*b;
  13. }
  14. int div(int a,int b)
  15. {
  16. return a/b;
  17. }
  18. void processData(int a,int b,int (*p)(int,int))
  19. {
  20. printf("%d\n",p(a,b));
  21. }
  22. int main(int argc, const char *argv[])
  23. {
  24. // int a[] = {1,4,8,6,3,5,-7,-5};
  25. // int len = sizeof(a)/sizeof(a[0]);
  26. int a = 10;
  27. int b = 5;
  28. processData(a,b,add);
  29. return 0;
  30. }

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

闽ICP备14008679号