二级指针的第三种内存模型

2018-09-12  本文已影响15人  带着白卡去旅行

no.1交换指针的方式排序:

tmp临时字符串指针
p2[i] = (char
)malloc(sizeof(char)*100);//char buf[100]
通过二级指针修改一级指针的内容

if (strcmp(p2[i], p2[j]) <0)
strcmp应用

内存四区图


内存四区图

#define  _CRT_SECURE_NO_WARNINGS
#include<stdlib.h>
#include<stdio.h>
#include<string.h>



void main()
{
    int i = 0, j = 0;
    char *tmp = NULL;
    char **p2 = NULL;
    int num = 5;
    p2 = (char**)malloc(sizeof(char)*num);

    for (i=0;i<num;i++)
    {

        p2[i] = (char*)malloc(sizeof(char*)*100);//char buf[100]
        sprintf(p2[i], "%d%d%d", i + 1, i + 1, i + 1);
    }

    //排序前:
    printf("排序前\n");
    for (int i=0;i<num;i++)
    {
        printf("%s\n",p2[i]);
    }

    //排序后:
    
    for (int i = 0; i < num; i++)
    {
        for (j = i+1; j < num; j++)
        {
            if (strcmp(p2[i], p2[j]) <0)
            {
                tmp = p2[i];
                p2[i] = p2[j];
                p2[j] = tmp;

            }
        }
    }

    //排序后:
    printf("排序后\n");
    for ( i = 0; i < num; i++)
    {
        printf("%s\n", p2[i]);
    }


    //释放内存
    for (i=0;i<num;i++)
    {
        if (p2[i]!=NULL)
        {
            free(p2[i]);
            p2[i] = NULL;
        }

    }
    if (p2!=NULL)
    {
        free(p2);
    }
    printf("hell world\n");
    system("pause");
    return 0;
}

交换内存块

char tmpbuf[100];
for (int i = 0; i < num; i++)
    {
        for (j = i + 1; j < num; j++)
        {
            if (strcmp(p2[i], p2[j]) < 0)
            {
                strcmp(tmpbuf , p2[i]);
                strcmp(p2[i] , p2[j]);
                strcmp(p2[j] , tmpbuf);

            }
        }
    }

可以实现相同的效果。

封装效果[指针做函数参数]


#define  _CRT_SECURE_NO_WARNINGS
#include<stdlib.h>
#include<stdio.h>
#include<string.h>



//分配内存【二级指针】
char**getMem(int num)
{
    char**p2 = NULL;
    p2 = (char**)malloc(sizeof(char*)*num);
    if (p2 == NULL)
    {
        return NULL;

    }

    for (int i=0;i<num;i++)
    {

        p2[i] = (char*)malloc(sizeof(char)*100);//char buf[100]
        sprintf(p2[i], "%d%d%d", i + 1, i + 1, i + 1);
    }
    return p2;//返回p2首地址
}

void printMyArray(char** myArray, int num)
{
    int i = 0;
    for (i = 0; i < num; i++)

    {
        printf("%s\n", *(myArray + i));
    }
}
void sortMyArray(char**myArray,int num)
{
    int i = 0; int j = 0;
    char *tmp=NULL;
    for (int i=0;i<num;i++)
    {
        for (int j=i;j<num;j++)
        {
            if (strcmp(myArray[i],myArray[j])>0)
            {
                tmp = myArray[i];
                myArray[i] = myArray[j];
                myArray[j] = tmp;
            }
        }
    }
}


void main()
{
    int i = 0, j = 0;
    char *tmp = NULL;
    char **p2 = NULL;
    int num = 5;
    p2 = getMem(num);

    //排序前:

    printf("排序前\n");
    printMyArray(p2,num);
    //排序后:
    sortMyArray(p2, num);

    //排序后:
    printf("排序后\n");
    printMyArray(p2, num);
    //释放内存
    for (i=0;i<num;i++)
    {
        if (p2[i]!=NULL)
        {
            free(p2[i]);
            p2[i] = NULL;
        }

    }
    if (p2!=NULL)
    {
        free(p2);
    }
    printf("hell world\n");
    system("pause");
    return 0;
}
上一篇下一篇

猜你喜欢

热点阅读