鱼C论坛

 找回密码
 立即注册
查看: 1639|回复: 0

[技术交流] 009-二级指针的三种内存模型

[复制链接]
发表于 2018-8-10 12:10:14 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 moc 于 2018-8-14 22:18 编辑

1、模型一
主调函数定义指针数组,如:char *ArrayStr[] = { "ccccc","aaaa", "bbbb", "11111"};被调函数形参采用二级指针接受,如char **ArrayStr。
注:上面指针数组初始化在Visual C++中会报错。
  1. #include "stdio.h"
  2. #include "stdlib.h"
  3. #include "string.h"

  4. // 打印函数
  5. int printArray(char **ArrayStr, int iNum)
  6. {
  7.         int i;
  8.         for (i = 0; i < iNum; i++)
  9.         {
  10.                 printf("%s \n", ArrayStr[i]);
  11.         }
  12.         return 0;       
  13. }

  14. // 排序函数
  15. int sortArrayStr(char **ArrayStr, int iNum)
  16. {
  17.         int i = 0, j = 0;
  18.         char *tmp;
  19.         for (i = 0; i < 4; i++)
  20.         {
  21.                 for (j = i+1; j<4; j++)
  22.                 {
  23.                         if (strcmp(ArrayStr[i], ArrayStr[j]) > 0)
  24.                         {
  25.                                 tmp = ArrayStr[i];
  26.                                 ArrayStr[i] = ArrayStr[j];
  27.                                 ArrayStr[j] = tmp;
  28.                         }
  29.                 }
  30.          }
  31.          return 0;
  32. }

  33. int main()
  34. {
  35.         char *ArrayStr[] = { "ccccc","aaaa", "bbbb", "11111"};
  36.        
  37.         printf("排序之前:\n");
  38.         printArray(ArrayStr, 4);
  39.        
  40.         sortArrayStr(ArrayStr, 4);
  41.        
  42.         printf("\n排序之后:\n");
  43.         printArray(ArrayStr, 4);
  44.        
  45.         system("pause");
  46.         return 0;       
  47. }
复制代码


2、模型二
主调函数定义二维数组,如:char myArray[10][30] = { "ccccc","aaaa", "bbbb", "11111"};被调函数形参采用二维数组接受,如char **ArrayStr。

  1. //打印
  2. int printfArray(char ArrayStr[10][30], int iNum)
  3. {
  4.         int i;
  5.         for (i = 0; i < iNum; i++)
  6.         {
  7.                 printf("%s \n", ArrayStr[i]);
  8.         }
  9.         return 0;
  10. }

  11. // 排序函数
  12. int sortArrayStr(char myArray[10][30], int iNum)
  13. {
  14.         int i = 0, j = 0;
  15.         char buf[30];
  16.         for (i = 0; i < iNum; i++)
  17.         {
  18.                 for (j = i + 1; j<iNum; j++)
  19.                 {
  20.                         if (strcmp(myArray[i], myArray[j]) > 0)
  21.                         {
  22.                                 strcpy(buf, myArray[i]);
  23.                                 strcpy(myArray[i], myArray[j]);
  24.                                 strcpy(myArray[j], buf);
  25.                         }
  26.                 }
  27.         }
  28.         return 0;
  29. }

  30. int main()
  31. {
  32.         int i = 0, j = 0;
  33.         char buf[30];   //buf数组名代表数组元素首地址
  34.                                         //下面两种,内存模型不一样
  35.                                         //         char *ArrayStr[] = { "ccccc","aaaa", "bbbb", "11111"};
  36.         char myArray[10][30] = { "cccc", "aaaa", "dddd", "11111" };   // 二维数组数组名代表什么

  37.         printf("排序之前:\n");
  38.         printfArray(myArray, 4);

  39.         sortArrayStr(myArray, 4);

  40.         printf("排序之后:\n");
  41.         printfArray(myArray, 4);
  42.         system("pause");
  43.         return 0;
  44. }
复制代码


3、模型三
        malloc 申请内存空间返回给二级指针,malloc 申请内存空间给数组,再用 二级指针做函数形参。
  1. int printfArr33(char **ArrayStr, int iNum)
  2. {
  3.         int i = 0;
  4.         for (i=0; i<iNum; i++)
  5.         {
  6.                 printf("%s \n", ArrayStr[i]);
  7.         }
  8.         return 0;
  9. }

  10. int printfArr2_23(char myArray[10][100], int iNum)
  11. {
  12.         int i = 0;
  13.         for (i=0; i<iNum; i++)
  14.         {
  15.                 printf("%s \n", myArray[i]);
  16.         }
  17.         return 0;

  18. }


  19. int sortArrayStr03(char **ArrayStr, int iNum)
  20. {
  21.         int i = 0, j = 0;
  22.         char *tmp = NULL;
  23.         //排序

  24.         for (i=0; i<iNum; i++)
  25.         {
  26.                 for (j=i+1; j<iNum; j++)
  27.                 {
  28.                         if (strcmp(ArrayStr[i],ArrayStr[j]) < 0)
  29.                         {
  30.                                 tmp = ArrayStr[i];
  31.                                 ArrayStr[i] = ArrayStr[j];
  32.                                 ArrayStr[j] = tmp;
  33.                         }
  34.                 }
  35.         }
  36.         return 0;
  37. }

  38. void main()
  39. {
  40.         int i = 0, j = 0;
  41.         char buf[100];
  42.         char **myarray = (char **)malloc(10*sizeof(char*)); //int array[10]
  43.         if (myarray == NULL)
  44.         {
  45.                 return;
  46.         }
  47.         for (i=0; i<10; i++)
  48.         {
  49.                 myarray[i] = (char *)malloc(100*sizeof(char)); //char buf[100];
  50.                 if (myarray[i]  == NULL)
  51.                 {
  52.                         printf("ddddde\n");
  53.                         return;
  54.                 }
  55.                 sprintf(myarray[i],"%d%d%d ", i, i, i);
  56.         }

  57.         //第三种内存模型打印
  58.         printf("排序之前\n");
  59.         printfArr33(myarray, 10);
  60.         //printfArr2_23(myarray, 10); //第二种打印不适合 err

  61.         sortArrayStr03(myarray, 10);

  62.         //第三种内存模型打印
  63.         printf("排序之后\n");
  64.         printfArr33(myarray, 10);

  65.         for (i=0; i<10; i++)
  66.         {
  67.                 free(myarray[i] );
  68.         }
  69.         if (myarray != NULL)
  70.         {
  71.                 free(myarray);
  72.         }

  73.         system("pause");
  74. }
复制代码



注记:排序中,使用临时数组和临时指针效果是一样的,但含义不一样,使用指针是改变指向的顺序,使用数组是改变指针指向的内容。

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-20 08:39

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表