• Linux C基础(9)


    1、指针的算术元素

    总结

    1.  p + n:p+n对于p向地址增大的方向移动n个数据
    2.   实际的变化:p + sizeof(数据类型)*n
    3.  p - n:p-n对于p向地址减小的方向移动n个数据
    4.   实际的变化:p - sizeof(数据类型)*n
    5.  p++:p向地址增大的方向移动1个数据
    6.   实际的变化:p + sizeof(数据类型)
    7.  p--:p向地址减小的方向移动1个数据
    8.   实际的变化:p - sizeof(数据类型)
    9.  p - q(p和q的数据类型相同):这两个指针之间相差的数据的个数
    10.   实际变化:(p - q)/sizeof(数据类型)

    注意

    1.  (1)指针的算术运算只有在操作连续的内存空间的时候才有意义
    2.  (2)p是指针变量,以上这些方法也适用于指针常量,但是++、--除外

    1.2 为什么使用数组名[下标]就可以访问数组中的元素

    总结

    1.  (1)数组名代表的是数组首元素的地址,地址常量,不能对它进行++、-- ,a的数据类型:int *
    2.  (2)数组名代表的是整个数组 sizeof(a)

    1.3 通过指针常量来访问

    1.  #include
    2.  void main()
    3.  {
    4.      int a[]={1,2,5,3,8,9,6};
    5.      int *p = a;
    6.      printf("p的起始地址:%d\n",p);//1703716
    7.      printf("*p++ = %d\n",*p++);//1
    8.      /*
    9.  *和++的优先级相同,运算顺序从右向左,所以*p++就相当于*(p++);
    10.  这里存在一个知识误区:本应该先执行括号内的p++,使p从指向a[0]变成指向a[1];
    11.  但其实事实并非如此;事实是,对于直接对*p++的输出来说,第一步是运算*p,输出后,第二步再运算p++;
    12.  需要注意的是:*和++对于p的运算,都是单独运算,比如第一步:*p就是对p所指向的地址进行取值,第二步:p++对于p所指向的地址+1个数据类型的字节数;
    13.  */
    14.      printf("*p++后的地址:%d\n",p);//1703720
    15.      printf("*p的值是:%d\n",*p);//2
    16.      printf("a[0]=%d\na[1]=%d\n",a[0],a[1]);//1,2
    17.  }

     *p++(先取值,再自加,地址自加,改变指针指向,所有指针常量不能自增)

    1.  p++ : p = p + 1
    2.  ++是有赋值操作的,所以p的值会被改变
    3.  p+1
    4.  访问p的下一个地址,因为没有对p的赋值操作,所以p值不会被改变。

    1.4 通过指针变量来访问

    1.5 数组的访问

    1.6 易错点

    案例1

    printf()是一个右结合,从右往左

    案例2

    形参都是当作指针来执行的

    案例3

    字符串常量不能被修改,但是可以被访问

    1.7 指针的指向没有发生改变

    1.8 指针的指向发生改变

    案例

     编写一子函数,实现字符串的链接
    1.  指针函数:指的是函数的返回值是一个指针,比如我的函数返回的是一个指向整数int的指针,定义格式如下:
    2.  ​
    3.  int *p(int a,int b); //注意这里的*与P之间是没有括号的,所以含义是函数p(int,int)会返回一个(int *)指针

    2、指针与二维数组

    a+j=&a[j] -> *(a+j)=a -> *(&a[i]+j)=a -> *(*(a+i)+j)=a

    总结

    1. 1、a、&a[0]、&a[0][0]的值是一样的,但是意义不一样
    2. 2、为什么a不是int **类型的
    3. a+1移动了一个数组(12byte),如果是int **的话加1移动4个字节
    4. 3、a指向a[0],a[0]是一个一维数组,所以说a指向了一个一维数组

    作业

    1. 以下都封装成子函数的形式(指针移动):
    2. 1、求一个字符串中有多少个空格
    3. 2、求字符串的长度
    4. 3、字符串的拷贝
    5. 4、字符串的比较
    6. 5、求指定字符在字符串中第一次出现的地址
    7. 6、求指定字符在字符串中最后一次出现的地址
    8. 7
    9. 1----------字符数组的输入
    10. 2----------输出
    11. 3----------排序

    1、求一个字符串中有多少个空格

    1. #include
    2. #include
    3. #define N 30
    4. int count(char * arr);
    5. int main(void)
    6. {
    7. int num= 0;
    8. char arr[N] = "h w h w h w";
    9. num = count(arr);
    10. printf("%d\n",num);
    11. return 0;
    12. }
    13. int count(char * arr)
    14. {
    15. int i,num = 0;
    16. char *p = arr;
    17. for(i = 0;i<strlen(arr);i++)
    18. {
    19. if((int)*(p)==32)
    20. {
    21. num++;
    22. }
    23. p++;
    24. }
    25. return num;
    26. }

    2、求字符串的长度

    1. #include
    2. #include
    3. #define N 30
    4. int str_long(char * arr);
    5. int main(void)
    6. {
    7. int i,j,num= 0;
    8. char arr[N] = "hwhwhw";
    9. num = str_long(arr);
    10. printf("%d\n",num);
    11. return 0;
    12. }
    13. int str_long(char * arr)
    14. {
    15. int i,j,num = 0;
    16. char *p = arr;
    17. while(*p)
    18. {
    19. num++;
    20. p++;
    21. }
    22. return num;
    23. }

    3、字符串的拷贝

    1. #include
    2. #include
    3. #define N 30
    4. void str_cp(char * arr, char * str);
    5. int main(void)
    6. {
    7. char arr[N] = "hello";
    8. char str[N] = "ok";
    9. str_cp(arr,str);
    10. puts(arr);
    11. return 0;
    12. }
    13. void str_cp(char * arr, char * str)
    14. {
    15. int i,j,num = 0;
    16. char *p = arr;
    17. char *pp = str;
    18. while(*pp)
    19. {
    20. *p=*pp;
    21. p++;
    22. pp++;
    23. }
    24. *p = '\0';
    25. }

    4、字符串的比较

    1. #include
    2. #include
    3. #define N 30
    4. int str_compare(char * arr, char * str);
    5. int main(void)
    6. {
    7. int result = 0;
    8. char arr[N] = "hxllo";
    9. char str[N] = "hallo";
    10. result = str_compare(arr, str);
    11. printf("%d\n",result);
    12. return 0;
    13. }
    14. int str_compare(char * arr, char * str)
    15. {
    16. int i,result = 0;
    17. char *p = arr;
    18. char *pp = str;
    19. while(*p && *pp)
    20. {
    21. if(*p != *pp)
    22. {
    23. break;
    24. }
    25. p++;
    26. pp++;
    27. }
    28. result = *p - *pp;
    29. return result;
    30. }

    5、求指定字符在字符串中第一次出现的地址

    1. #include
    2. #include
    3. #define N 30
    4. char *str_first(char * arr, char str);
    5. int main(void)
    6. {
    7. char arr[N] = "hello";
    8. char str = 'e';
    9. char * result = str_first(arr, str);
    10. printf("%p\n",arr);
    11. printf("%p\n",result);
    12. return 0;
    13. }
    14. char *str_first(char * arr,char str)
    15. {
    16. char * result = NULL;
    17. char * p = arr;
    18. while(*p)
    19. {
    20. if(*p == str)
    21. {
    22. result = p;
    23. break;
    24. }
    25. p++;
    26. }
    27. return result;
    28. }

    6、求指定字符在字符串中最后一次出现的地址

    1. #include
    2. #include
    3. #define N 30
    4. char *str_last(char * arr, char str);
    5. int main(void)
    6. {
    7. char arr[N] = "helle";
    8. char str = 'e';
    9. char * result = str_last(arr, str);
    10. printf("%p\n",arr);
    11. printf("%p\n",result);
    12. return 0;
    13. }
    14. char *str_last(char * arr,char str)
    15. {
    16. char * result = NULL;
    17. char * p = arr;
    18. while(*p)
    19. {
    20. if(*p == str)
    21. {
    22. result = p;
    23. }
    24. p++;
    25. }
    26. return result;
    27. }

    7、一个控制台

    1. 1----------字符数组的输入
    2. 2----------输出
    3. 3----------排序
    1. #include
    2. #include
    3. #include
    4. #define N 30
    5. void menu();
    6. void input(char * a);
    7. void output(char * a);
    8. void swap(char * a);
    9. int main(void)
    10. {
    11. char arr[30] = {'\0'};
    12. int fun = 0;
    13. while(1)
    14. {
    15. menu();
    16. printf("请选择功能");
    17. scanf("%d",&fun);
    18. switch(fun)
    19. {
    20. case 1:
    21. input(arr);
    22. break;
    23. case 2:
    24. output(arr);
    25. break;
    26. case 3:
    27. swap(arr);
    28. break;
    29. case -1:
    30. exit(0);
    31. }
    32. }
    33. return 0;
    34. }
    35. void menu()
    36. {
    37. printf("功能菜单\n");
    38. printf("1-数组的输入\n");
    39. printf("2-数组的输出\n");
    40. printf("3-排序\n");
    41. printf("-1-exit\n");
    42. }
    43. //输入
    44. void input(char * a)
    45. {
    46. getchar();
    47. gets(a);
    48. }
    49. //输出
    50. void output(char * a)
    51. {
    52. //puts(a);
    53. for(int i=0;i<strlen(a);i++)
    54. printf("%c\n",*(a+i));
    55. }
    56. //排序
    57. void swap(char * a)
    58. {
    59. int i,j,tmp = 0;
    60. int num = 0;
    61. char * p = a;
    62. while(*p)
    63. {
    64. p++;
    65. num++;
    66. }
    67. printf("%d",num);
    68. for(i=1;i
    69. {
    70. char * pp = a;
    71. for(j=0;j
    72. {
    73. if(*(pp)>*(pp+1))
    74. {
    75. printf("2\n");
    76. tmp=*pp;
    77. *pp=*(pp+1);
    78. *(pp+1)=tmp;
    79. }
    80. pp++;
    81. }
    82. }
    83. }

    *(++p):先加加,再取值

  • 相关阅读:
    数学王国找寻另一半:求一个整数的真因子总和,算法优化解决方案超时问题
    洛谷P1796 汤姆斯的天堂梦
    c++day6实现成模板类
    系统优化与微服务架构、分布式架构的合理性思考
    Windows进程间利用管道通信
    SpringCloud——注册中心nacos
    API对接需求如何做需求调研,需要注意什么?
    hadoop学习笔记-centos环境
    代码整洁之道第四章 注释
    常用的几种异步实现方式
  • 原文地址:https://blog.csdn.net/m0_58540923/article/details/134235770