二级指针做函数参数的输入、输出特性
1、输入特性
主调函数分配内存,被调函数使用内存
<1>内存分配在堆区
void printArray(int **pArray,int len )
{
for(int i=0;i<len;i++)
{
printf("%d\n",*pArray[i]);
}
}
void test01()
{
//堆区
int **pArray=malloc(sizeof(int *)*5);
//在栈上创建5个数据
int a1=10;
int a2=20;
int a3=30;
int a4=40;
int a5=50;
pArray[0]=&a1;
pArray[1]=&a2;
pArray[2]=&a3;
pArray[3]=&a4;
pArray[4]=&a5;
//打印数组
printArray(pArray,5);
//释放堆区内存
if(pArray!=NULL)
{
free(pArray);
pArray=NULL;
}
}
<2>内存分配在栈区
void printArray(int **pArray,int len )
{
for(int i=0;i<len;i++)
{
printf("%d\n",*pArray[i]);
}
}
void freeSpace(int **pArray,int len)
{
for(int i=0;i<5;i++)
{
free(pArray[i]);
pArray[i]=NULL;
}
}
void test02()
{
//栈区
int *pArray[5]; //指针数组---等价于---二级指针
for(int i=0;i<5;i++)
{
pArray[i]=malloc(4);
*(pArray[i])=10+i;
}
printArray(pArray,5); //指针数组---等价于---二级指针
}
//释放
freeSpace(pArray,5);
2、输出特性
被调函数分配内存主调函数使用
void allocateSpace(int ** p)
{
int * temp = malloc(sizeof(int)* 10);
for (int i = 0; i < 10;i++)
{
temp[i] = 100 + i;
}
*p = temp;
}
void printArray(int ** pArray, int len)
{
for (int i = 0; i < len;i++)
{
printf("%d\n", (*pArray)[i]); //二级指针解引用--->一级指针--->数组名
}
}
void freeSpace(int ** pArray)
{
if (*pArray != NULL)
{
free(*pArray);
*pArray = NULL;
}
}
void test01()
{
int * p = NULL;
allocateSpace(&p); // 结束后:p=temp(地址)
printArray(&p, 5);
freeSpace(&p);
if (p == NULL)
{
printf("空指针\n");
}
else
{
printf("野指针\n");
}
}
3、二级指针练习
//获取有效行数
int getFileLines(FILE * pFile)
{
if (pFile == NULL)
{
return -1;
}
char buf[1024] = { 0 };
int lines = 0;
while (fgets(buf,1024,pFile) != NULL)
{
//printf("%s", buf);
lines++;
}
//将文件光标置首
fseek(pFile, 0, SEEK_SET);
return lines;
}
//读取数据放入到pArray中
void readFileData(FILE * pFile, int len, char ** pArray)
{
if (pFile == NULL)
{
return;
}
if (len <= 0 )
{
return;
}
if ( pArray ==NULL)
{
return;
}
char buf[1024] = { 0 };
int index = 0;
while (fgets(buf, 1024, pFile) != NULL)
{
/*
aaaaaaaaaa
bbbb
cccccc
*/
int currentLen = strlen(buf) +1 ;
char * currentStrP = malloc(sizeof(char)* currentLen);
strcpy(currentStrP, buf);
pArray[index++] = currentStrP;
memset(buf, 0, 1024);
}
}
void showFileData(char ** pArray, int len)
{
for (int i = 0; i < len;i++)
{
printf("%d行的数据为 %s", i + 1, pArray[i]);
}
}
void test01()
{
//打开文件
FILE * fp = fopen("./test.txt", "r");
if (fp == NULL)
{
perror("open error");
return;
}
//统计有效行数
int len = getFileLines(fp);
//printf("文件的有效行数为:%d\n", len);
char ** pArray = malloc(sizeof(char *)* len);
//读取文件中的数据并且放入到 pArray中
readFileData(pFile, len, pArray);
//读取数据
showFileData(pArray , len);
//释放堆区内容
for (int i = 0; i < len; i++)
{
if (pArray[i] != NULL)
{
free(pArray[i]);
pArray[i] = NULL;
}
}
free(pArray);
pArray = NULL;
//关闭文件
fclose(pFile);
}