本博客主要介绍一级指针,二级指针,三级指针,指针数组和数组指针的综合应用示例。下面简单介绍指针数组和数组指针的区别:
指针数组: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; }