二级指针做输入的第二种内存模型: 二维数组

有二维数组char myArray[10][30]。写打印函数和排序函数

 

打印API:

void printMyArray02(char myArray[10][30], int num)
{
  int i = 0;
  for (i = 0; i < num; i++)
  {
    printf("%s\n", myArray[i]);// printf("%s\n", *(myArray+i));
  }
}

 

void main()
{
  int num = 4;

  char myArray[10][30] = { "aaaaaa", "ccccc", "bbbbb", "1111111" };

  printMyArray02(myArray, num);

}

上一节 二级指针做输入的第一种模型:指针数组 里也有排序函数,能不能用这儿的myArray做参数去调用printMyArray可以吗?

不可以,会直接崩掉

因为,二个myArray虽然都是指针,但是指针的步长并不一样。myArray 指向 myArray[0], myArray+1 指向 myArray[1]。 步长为30(数组的列为30个char)

上一节 二级指针做输入的第一种模型:指针数组 里的函数形参为char **myArray,指针步长为4。所以二个指针的类型根本不是同一种类型,指针的类型取决于它指向的内存空间的类型。

所以这儿的形参必须是(char myArray[10][30], int num), 而不是(char **myArray, int num)。

 

排序API:

上面已经了解为什么形参是 char myArray[10][30] 而不是 char **myArray 了。这儿 API的形参同理:

void sortArray02(char myArray[10][30], int num)
{
  int i = 0, j = 0;
  char tmpbuf[30] = { 0 };
  //排序
  for (i = 0; i < num; i++)
  {
    for (j = i + 1; j < num; j++)
    {
      if (strcmp(myArray[i], myArray[j]) > 0)//前面的大 交换
      {
        strcpy_s(tmpbuf, 30, myArray[i]); //PS:交换的是myArray[i]指向的内存块,所以用strcpy_s进行拷贝,上一节是交换指针指向的内存地址
        strcpy_s(myArray[i], 30, myArray[j]);
        strcpy_s(myArray[j], 30, tmpbuf);
      }

    }
  }
}

posted on 2019-01-25 14:33  锋邢天下  阅读(208)  评论(0编辑  收藏  举报

导航