二级指针做函数参数的输入输出特性

二级指针做函数参数的输入、输出特性

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);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值