二级指针:在主函数中申明变量,在子函数中分配内存,有两种方式返回二级指针。在这个过程只有深刻理解了C的函数调用模型,以及指针的内存模型,才能够掌握好。
#pragma once
#include <iostream>
#include <string>
using namespace std;
//二级指针通过返回值的方式返回
char ** sortArray1Array2(char **array1, int count1, char(*array2)[30], int count2, int * totalNum)
{
*totalNum = count1 + count2;
char **p = (char**)malloc((*totalNum) * sizeof(char*));
if (p == NULL)
{
throw exception("申请内存出现错误");
}
for (int i = 0; i < *totalNum; i++)
{
p[i] = (char*)malloc(30 * sizeof(char));
if (p[i] == NULL)
{
throw exception("申请内存错误");
}
}
for (int i = 0; i < count1; i++)
{
strcpy_s(p[i], 30, array1[i]);
}
for (int i = 0; i < count2; i++)
{
strcpy_s(p[count1 + i], 30, array2[i]);
}
char *tmp = NULL;
for (int i = 0; i < *totalNum; i++)
{
for (int j = i + 1; j < *totalNum; j++)
{
if (strcmp(p[i], p[j]) > 0)
{
tmp = p[i];
p[i] = p[j];
p[j] = tmp;
}
}
}
return p;
}
//二级指针通过函数参数3级指针的方式返回;传入的时候需要传入的是变量的地址
int sortArray1Array2(char **array1, int count1, char(*array2)[30], int count2, char ***array3)
{
int totalNum = count1 + count2;
char **p = (char**)malloc((totalNum) * sizeof(char*));
*array3 = p;
if (p == NULL)
{
throw exception("申请内存出现错误");
}
for (int i = 0; i < totalNum; i++)
{
p[i] = (char*)malloc(30 * sizeof(char));
if (p[i] == NULL)
{
throw exception("申请内存错误");
}
}
for (int i = 0; i < count1; i++)
{
strcpy_s(p[i], 30, array1[i]);
}
for (int i = 0; i < count2; i++)
{
strcpy_s(p[count1 + i], 30, array2[i]);
}
char *tmp = NULL;
for (int i = 0; i < totalNum; i++)
{
for (int j = i + 1; j < totalNum; j++)
{
if (strcmp(p[i], p[j]) > 0)
{
tmp = p[i];
p[i] = p[j];
p[j] = tmp;
}
}
}
return totalNum;
}
void freePtr(char ** array1, int arrayNum)
{
for (int i = 0; i < arrayNum; i++)
{
free(array1[i]);
}
free(array1);
}
void test()
{
int i = 0;
char ** pArray3 = NULL;
int nArray3Num = 0;
//指针数组
char * array1[] = { "bbbbbb", "aaaa", "cccccc", "2222", "1111111111", "444444" };
//二维数组
char array2[10][30] = { "zzzzzz", "yyyyyy", "3333333333" };
pArray3 = sortArray1Array2(array1, 6, array2, 3, &nArray3Num);
nArray3Num = sortArray1Array2(array1, 6, array2, 3, &pArray3);
for (int i = 0; i < nArray3Num; i++)
{
cout << pArray3[i] << endl;
}
if (pArray3 != NULL)
{
freePtr(pArray3, nArray3Num);
pArray3 = NULL;
}
}