本博客主要介绍一级指针,二级指针,三级指针,指针数组和数组指针的综合应用示例。下面简单介绍指针数组和数组指针的区别:
指针数组:char *p[] = {"aaa","bbbb"};
定义了一个数组p,p中每一个元素都是一个指针。
数组指针: char (*p)[5];
定义了一个指针p,p指向一个长度为5的数组,即p使一个数组指针变量 。
本示例代码目的是:将两个内存块中值复制到另一个中并排序。
下面是示例代码:
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
//下面有两种释放内存空间 的方法:
void free_merge_sort1(char **p, int num)
{
int i = 0;
if (p == NULL)
{
return;
}
for (;i<num; i++)
{
free(p[i]);
}
free(p);
}
void free_merge_sort2(char ***p, int num)
{
int i = 0;
char **tmp = NULL;
if (p == NULL)
{
return;
}
tmp = *p;//还原成二级指针
if (tmp == NULL)
{
return;
}
for (;i<num; i++)
{
free(tmp[i]);
}
free(tmp);
*p = NULL;//间接赋值
}
int merge_sort(char **myp1, int num1, char (*myp2)[30],int num2, char ***myp3, int *num3)//函数调用参数有:二级指针,
//数组指针,三级指针和一级指针
{
int ret = 0;
int i= 0;
int j = 0;
int tmplen = 0;
int num = 0;
int k = 0;
char *tmp = NULL;
char **tmp3 = NULL;
if (myp1 == NULL || myp2 == NULL)
{
ret = -1;
printf("myp1 == NULL || myp2 == NULL : %d \n",ret);
goto END;
}
num = num1 + num2;
tmp3 = (char **)malloc(num * sizeof(char *));
if (tmp3 == NULL)
{
ret = -2;
goto END;
}
for (i=0; i<num1; i++)
{
tmplen = strlen(myp1[i]) + 1;
tmp3[i] = (char *)malloc(tmplen * sizeof(char));
if (tmp3[i] == NULL)
{
ret = -3;
goto END;
}
strcpy(tmp3[i], myp1[i]);
}
for (j=0; j<num2; j++,i++)
{
tmplen = strlen(myp2[j]) + 1;
tmp3[i] = (char *)malloc(tmplen * sizeof(char));
if (tmp3[i] == NULL)
{
ret = -4;
goto END;
}
strcpy(tmp3[i], myp2[j]);
}
for (k=0; k<num; k++)
{
for (j=k+1; j<num; j++)
{
if (strcmp(tmp3[k],tmp3[j]) > 0)
{
tmp = tmp3[k];
tmp3[k] = tmp3[j];
tmp3[j] = tmp;
}
}
}
*num3 = num;
*myp3 = tmp3;//间接赋值
END:
if (i != num)//如果判断成立,则中间有错误,需要释放申请的内存。这里巧妙的利用了i的变化来释放申请的内存
{
if (tmp3 != NULL)
{
free_merge_sort1(tmp3, i);//这里是i
}
}
return ret;
}
int main()
{
int ret = 0;
char *p1[] = {"aaaa","ddddddd","bbbbbb"};
char buf2[10][30] = {"111111","444444","3333333"};
char **p3 = NULL;
int len1, len2, len3;
int i = 0;
len1 = sizeof(p1)/sizeof(*p1);
len2 = 3;
len3 = len1 + len2;
ret = merge_sort(p1, len1, buf2, len2, &p3, &len3);
if (ret != 0)
{
printf("func merge_sort err: %d",ret);
return ret;
}
for (i=0; i<len3; i++)
{
printf("%s ",p3[i]);
}
printf("\n");
return 0;
}