间接赋值成立的条件

  • 条件1 定义1个变量(实参) 定义1个变量(形参)
  • 条件2 建立关联,把实参取地址传给形参
  • 条件3 *形参去间接的修改了实参的值

间接赋值推论

在函数调用的时候

  • 用1级指针形参,去间接修改了0级指针(实参)的值
  • 用2级指针形参,去间接修改了1级指针(实参)的值
  • 用3级指针形参,去间接修改了2级指针(实参)的值
  • 用n级指针形参,去间接修改了n-1级指针(实参)的值

代码

  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include<stdio.h>
  3. #include<stdlib.h>
  4. #include<string.h>
  5. int getMemPt(char **myp1, int *mylen1, char **myp2, int *mylen2) {
  6. int ret = 0;
  7. char *tmp1, *tmp2;
  8. tmp1 = (char *)malloc(100);
  9. strcpy(tmp1, "abcde");
  10. *mylen1 = strlen(tmp1); // 1级指针
  11. *myp1 = tmp1; // 2级指针
  12. tmp2 = (char *)malloc(200);
  13. strcpy(tmp2, "123456987");
  14. *mylen2 = strlen(tmp2); // 1级指针
  15. *myp2 = tmp2; // 2级指针
  16. return ret;
  17. }
  18. void main()
  19. {
  20. int ret = 0;
  21. char *p1 = NULL;
  22. int len1 = 0;
  23. char *p2 = NULL;
  24. int len2 = 0;
  25. ret = getMemPt(&p1, &len1, &p2, &len2);
  26. if (ret != 0) {
  27. printf("func getMemPt() err: %d\n", ret);
  28. return ret;
  29. }
  30. printf("p1:%s\n", p1);
  31. printf("p2:%s\n", p2);
  32. if (p1 != NULL) {
  33. free(p1);
  34. p1 = NULL;
  35. }
  36. if (p2 != NULL) {
  37. free(p2);
  38. p2 = NULL;
  39. }
  40. printf("p1: %d \t p2: %d\n", p1, p2);
  41. /*
  42. 输出结果:
  43. p1:abcde
  44. p2:123456987
  45. p1: 0 p2: 0
  46. */
  47. system("pause");
  48. return;
  49. }

间接赋值的应用场景