二级指针相对于一级指针,显得更难,难在于指针和数组的混合,定义不同类型的二级指针,在使用的时候有着很大的区别第一种内存模型char *arr[]

若有如下定义

char*arr[] = {"abc","def","ghi"};
复制代码

这种模型为二级指针的第一种内存模型,在理解的时候应该这样理解:定义了一个指针数组(char * []),数组的每个元素都是一个地址。

在使用的时候,若要使用中间量操作元素,那么此时中间量应该定义为

char*tmp =NULL;
复制代码

如果要打印这个数组,那么可以使用以下函数

int printAarray(char**pArray,int num)

  • {int i =0;

  • if (pArray == NULL)

  • {

  • return -1;

  • }

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

  • {

  • printf("%s \n", pArray[i]);

  • }

  • return 0;

  • }
  • 复制代码

    第二种内存模型char arr[][]

    若有如下定义

    char arr[3][5] = {"abc", "def", "ghi"};
    复制代码

    这种模型为二级指针的第二种内存模型,在理解的时候应该这样理解:定义了一个二维数组,有3个(5个char)空间的存储变量。

    在使用的时候,若要使用中间量操作元素,那么此时中间量应该定义为

    char tmp[5] = {0};

    如果要打印这个数组,那么可以使用以下函数

    nt printAarray(char pArray[][5],int num)

  • {

  • int i =0;

  • if

  • (pArray == NULL)

  • {

  • return -1;

  • }

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

  • {

  • printf("%s \n", pArray[i]);

  • }

  • return0;

  • }
  • 复制代码

    第三种内存模型char **arr


    若有如下定义

    char**arr = (char*)malloc(100*sizeof(char*));

  • //char arr[400]

  • arr[0] = (char*)malloc(100*sizeof(char));

  • //char buf[100]

  • arr[1] = (char*)

  • malloc(100*sizeof(char));

  • arr[2] = (char*)

  • malloc(100*sizeof(char));

  • strcpy(arr[0],"abc");

  • strcpy(arr[1],"def");

  • strcpy(arr[2],"ghi");

  • ···

  • for(int i = 0 ; i < 3 ; i++)

  • if(arr[i] !=NULL)

  • free(arr[i]);

  • free(arr);
  • 复制代码

    这种模型为二级指针的第二种内存模型,在理解的时候应该这样理解:定义了一个二级指针,二级指针就是指向指针的指针,其实就是开辟了100个指针空间,存放了100个地址。这种写法是第一种的简化写法

    在使用的时候,若要使用中间量操作元素,那么此时中间量应该定义为

    char*tmp =NULL

    如果要打印这个数组,那么可以使用以下函数

    {inti = 0 ;

  • if (pArray ==NULL)

  • {return -1 ;}

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

  • {

  • printf("%s \n", pArray[i]);

  • }

  • return 0 ;

  • }
  • 复制代码