鱼C论坛

 找回密码
 立即注册
查看: 1712|回复: 0

[技术交流] 009-二级指针的三种内存模型

[复制链接]
发表于 2018-8-10 12:10:14 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 moc 于 2018-8-14 22:18 编辑

1、模型一
主调函数定义指针数组,如:char *ArrayStr[] = { "ccccc","aaaa", "bbbb", "11111"};被调函数形参采用二级指针接受,如char **ArrayStr。
注:上面指针数组初始化在Visual C++中会报错。
#include "stdio.h"
#include "stdlib.h"
#include "string.h"

// 打印函数 
int printArray(char **ArrayStr, int iNum)
{
        int i;
        for (i = 0; i < iNum; i++)
        {
                printf("%s \n", ArrayStr[i]);
        }
        return 0;        
}

// 排序函数 
int sortArrayStr(char **ArrayStr, int iNum)
{
        int i = 0, j = 0;
        char *tmp; 
        for (i = 0; i < 4; i++) 
        {
                for (j = i+1; j<4; j++)
                {
                        if (strcmp(ArrayStr[i], ArrayStr[j]) > 0)
                        {
                                tmp = ArrayStr[i];
                                ArrayStr[i] = ArrayStr[j];
                                ArrayStr[j] = tmp;
                        }
                }
         } 
         return 0;
}

int main()
{
        char *ArrayStr[] = { "ccccc","aaaa", "bbbb", "11111"};
        
        printf("排序之前:\n");
        printArray(ArrayStr, 4);
        
        sortArrayStr(ArrayStr, 4);
        
        printf("\n排序之后:\n");
        printArray(ArrayStr, 4);
        
        system("pause");
        return 0;        
}

2、模型二
主调函数定义二维数组,如:char myArray[10][30] = { "ccccc","aaaa", "bbbb", "11111"};被调函数形参采用二维数组接受,如char **ArrayStr。
//打印
int printfArray(char ArrayStr[10][30], int iNum)
{
        int i;
        for (i = 0; i < iNum; i++)
        {
                printf("%s \n", ArrayStr[i]);
        }
        return 0;
}

// 排序函数 
int sortArrayStr(char myArray[10][30], int iNum)
{
        int i = 0, j = 0;
        char buf[30];
        for (i = 0; i < iNum; i++)
        {
                for (j = i + 1; j<iNum; j++)
                {
                        if (strcmp(myArray[i], myArray[j]) > 0)
                        {
                                strcpy(buf, myArray[i]);
                                strcpy(myArray[i], myArray[j]);
                                strcpy(myArray[j], buf);
                        }
                }
        }
        return 0;
}

int main()
{
        int i = 0, j = 0;
        char buf[30];   //buf数组名代表数组元素首地址 
                                        //下面两种,内存模型不一样 
                                        //         char *ArrayStr[] = { "ccccc","aaaa", "bbbb", "11111"};
        char myArray[10][30] = { "cccc", "aaaa", "dddd", "11111" };   // 二维数组数组名代表什么 

        printf("排序之前:\n");
        printfArray(myArray, 4);

        sortArrayStr(myArray, 4);

        printf("排序之后:\n");
        printfArray(myArray, 4);
        system("pause");
        return 0;
}

3、模型三
        malloc 申请内存空间返回给二级指针,malloc 申请内存空间给数组,再用 二级指针做函数形参。
int printfArr33(char **ArrayStr, int iNum)
{
        int i = 0;
        for (i=0; i<iNum; i++)
        {
                printf("%s \n", ArrayStr[i]);
        }
        return 0;
}

int printfArr2_23(char myArray[10][100], int iNum)
{
        int i = 0;
        for (i=0; i<iNum; i++)
        {
                printf("%s \n", myArray[i]);
        }
        return 0;

}


int sortArrayStr03(char **ArrayStr, int iNum)
{
        int i = 0, j = 0;
        char *tmp = NULL;
        //排序

        for (i=0; i<iNum; i++)
        {
                for (j=i+1; j<iNum; j++)
                {
                        if (strcmp(ArrayStr[i],ArrayStr[j]) < 0)
                        {
                                tmp = ArrayStr[i];
                                ArrayStr[i] = ArrayStr[j];
                                ArrayStr[j] = tmp;
                        }
                }
        }
        return 0;
}

void main()
{
        int i = 0, j = 0;
        char buf[100];
        char **myarray = (char **)malloc(10*sizeof(char*)); //int array[10]
        if (myarray == NULL)
        {
                return;
        }
        for (i=0; i<10; i++)
        {
                myarray[i] = (char *)malloc(100*sizeof(char)); //char buf[100];
                if (myarray[i]  == NULL)
                {
                        printf("ddddde\n");
                        return;
                }
                sprintf(myarray[i],"%d%d%d ", i, i, i);
        }

        //第三种内存模型打印 
        printf("排序之前\n");
        printfArr33(myarray, 10);
        //printfArr2_23(myarray, 10); //第二种打印不适合 err

        sortArrayStr03(myarray, 10);

        //第三种内存模型打印
        printf("排序之后\n");
        printfArr33(myarray, 10);

        for (i=0; i<10; i++)
        {
                free(myarray[i] );
        }
        if (myarray != NULL) 
        {
                free(myarray);
        }

        system("pause");
}


注记:排序中,使用临时数组和临时指针效果是一样的,但含义不一样,使用指针是改变指向的顺序,使用数组是改变指针指向的内容。

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-2 08:30

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表