二级指针相对于一级指针,显得更难,难在于指针和数组的混合,定义不同类型的二级指针,在使用的时候有着很大的区别第一种内存模型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 ;
}
复制代码