[关闭]
@lishuhuakai 2015-05-17T13:47:45.000000Z 字数 2451 阅读 1512

二维指针 练习

二维指针的练习

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. void main()
  5. {
  6. //直接定义一个数组的指针
  7. //a是数组首元素的地址
  8. int a[5] = { 2, 3, 4, 5, 6 };
  9. int(*p)[5] = &a; //p是数组指针
  10. //1.myarray也是数组首元素的地址
  11. //2.myarray是一个常量指针
  12. //3.myarray是一个数组指针
  13. int myarray[3][5];
  14. for (int i = 0; i < 5; ++i)
  15. {
  16. printf("%d\n", (*p)[i]);
  17. }
  18. //&a 步长 5*4 = 20;
  19. int tmp = 0;
  20. for (int i = 0; i < 3; ++i)
  21. {
  22. for (int j = 0; j < 5; ++j)
  23. {
  24. myarray[i][j] = tmp++;
  25. }
  26. }
  27. printf("myarray:%d myarray + 1:%d\n", myarray, myarray + 1);
  28. printf("&a:%d &a + 1:%d\n", &a, &a + 1);
  29. p = myarray; //很神奇的地方
  30. for (int i = 0; i < 3; ++i)
  31. {
  32. for (int j = 0; j < 5; ++j)
  33. {
  34. p[i][j] = tmp++;
  35. printf("%d ", p[i][j]);
  36. }
  37. }
  38. system("pause");
  39. }

多维数组在内存里面按照线性存储

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. //1.不管是几维数组都是线性存储的,所以说会存在多为数组做函数参数退化的问题。
  5. //2.多维数组做函数参数的时候,二维数组能够勉强表达出来,但是三维数组,四维数组就表达不出来了。
  6. //结论:指针做函数参数,有效的内存维数,只到二级..如果你看到三级指针,四级指针,它表示的不是内存的维数。
  7. void printfTwoArray(int *a, int num)
  8. {
  9. for (int i = 0; i < num; i++)
  10. {
  11. printf("%d ", a[i]); //从这里的输出结果可以看出多维数组在内存里线性存储
  12. }
  13. }
  14. //需要告诉编译器要跳多远
  15. void myfunc(int a[][10])
  16. {
  17. }
  18. void main()
  19. {
  20. int myarray[3][5];
  21. int tmp = 0;
  22. int *p = NULL;
  23. //定义为一个数组指针
  24. for (int i = 0; i < 3; ++i)
  25. {
  26. for (int j = 0; j < 5; ++j)
  27. {
  28. myarray[i][j] = tmp++;
  29. }
  30. }
  31. p = (int *)myarray;
  32. printfTwoArray(p, 3 * 5);
  33. system("pause");
  34. }

我们查看下面的一段代码:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. //指针类型不一样=====》内存模型不一样
  5. //没有类型,哪来指针!
  6. int printfOneArray_01(char buf[64], int iNum)
  7. {
  8. for (int i = 0; i < iNum; ++i)
  9. {
  10. printf("%s\n", buf[i]);
  11. }
  12. return 0;
  13. }
  14. int printfOneArray_02(char buf[], int iNum)
  15. {
  16. for (int i = 0; i < iNum; ++i)
  17. {
  18. printf("%s\n", buf[i]);
  19. }
  20. return 0;
  21. }
  22. int printfOneArray_03(char **buf, int iNum)
  23. {
  24. for (int i = 0; i < iNum; ++i)
  25. {
  26. printf("%s\n", buf[i]);
  27. }
  28. return 0;
  29. }
  30. //比较下面函数参数的三种写法
  31. int printfTwoArray_01(char buf[10][30], int iNum)
  32. {
  33. for (int i = 0; i < iNum; ++i)
  34. {
  35. printf("%s\n", buf[i]);
  36. }
  37. return 0;
  38. }
  39. int printfTwoArray_02(char buf[][30], int iNum)
  40. {
  41. for (int i = 0; i < iNum; ++i)
  42. {
  43. printf("%s\n", buf[i]);
  44. }
  45. return 0;
  46. }
  47. int printfTwoArray_03(char(*buf)[30], int iNum)
  48. {
  49. for (int i = 0; i < iNum; ++i)
  50. {
  51. printf("%s\n", buf[i]);
  52. }
  53. return 0;
  54. }
  55. int sortArrayStr(char myArray[10][30], int iNum)
  56. {
  57. //排序
  58. char buf[30];
  59. for (int i = 0; i < 4; i++)
  60. {
  61. for (int j = i + 1; j < 4; ++j)
  62. {
  63. if (strcmp(myArray[i], myArray[j]) > 0)
  64. {
  65. strcpy_s(buf, myArray[i]);
  66. strcpy_s(myArray[i], myArray[j]);
  67. strcpy_s(myArray[j], buf);
  68. }
  69. }
  70. }
  71. return 0;
  72. }
  73. //
  74. //int array[10]===>int *===>
  75. void main()
  76. {
  77. char myArray[10][30];
  78. //二维数组的数组名代表什么呢?
  79. strcpy_s(myArray[1], "aaaaa");
  80. strcpy_s(myArray[0], "bbbbb");
  81. strcpy_s(myArray[4], "ccccc");
  82. strcpy_s(myArray[5], "ddddd");
  83. strcpy_s(myArray[2], "eeeee");
  84. strcpy_s(myArray[3], "fffff");
  85. //打印第二种内存模型
  86. printf("第二种内存模型排序之前:\n");
  87. printfTwoArray_02(myArray, 5);
  88. //printfArr01(myArray, 4); //无法使用
  89. sortArrayStr(myArray, 5);
  90. printf("第二种内存模型排序之后\n");
  91. printfTwoArray_02(myArray, 5);
  92. system("pause");
  93. }

二级数组内存模型图

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注