c语言二级指针内存模型

第一种: 指针数组作为输入参数

char *myArray[] = {"aaaaaa", "ccccc", "bbbbbb", "111111"};//指针数组,数组中的每个元素都是指针,
int num = 4;

 

void printMyArray11(char **myArray, int num)
{
	int i = 0;
	for (i=0; i<num; i++)
	{
		//printf("%s \n", myArray[i]);
		printf("%s \n", *(myArray+i) );
	}
}

  正确地调用方法:

printMyArray11(myArray, num);

  

  

 

第二种 : 二级指针作输入---内存模型(分配内存块已知的情况)

char myArray[10][30] = {"aaaaaa", "ccccc", "bbbbbbb", "1111111111111"};
int num =4;

作为如下函数的实参,不能实现功能,

//错误调用方法:
void printMyArray02_err(char **myArray, int num) { int i = 0; for (i=0; i<num; i++) { //printf("%s \n", myArray[i]); printf("%s \n", *(myArray+i) ); // } }
正确调用方法:
void printMyArray02(char myArray[10][30], int num)
{
	int i = 0;
	for (i=0; i<num; i++)
	{
		//printf("%s \n", myArray[i]);
		printf("%s \n", *(myArray+i) );  //
	}
}

 理由:指针步长不一样,指针所指向的内存空间的数据类型不一样。

 

  第三种内存模型:通过堆进行分配内存

//在主函数中进行变量的定义(如下)
char ** p2 =NULL;	

//定义子函数
char **GetMem(int num)
{
	int i = 0;
	char **p2 = NULL;
	p2 = (char **)malloc(sizeof(char *) * num);
	if (p2 == NULL)
	{
		return NULL;
	}

	for (i=0; i<num; i++)
	{
		p2[i] = (char *)malloc(sizeof(char)  * 100  ); //char buf[100];
		sprintf(p2[i], "%d%d%d", i+1, i+1, i+1);
	}
	return p2;
}

//主函数中调用
p2 = GetMem(num);

//操作完之后一定要调用如下的释放内存函数进行释放
void GetMemFree(char **p2, int num)
{
	int i = 0;
	//释放内存
	for(i=0; i<num; i++)
	{
		if (p2[i] != NULL)
		{
			free(p2[i]);
			p2[i] = NULL;
		}
	}
	if (p2!=NULL) 
	{
		free(p2);
	}
}

 二级指针的三种内存模型如下所示:

 

posted @ 2019-02-05 22:15  hai5111  阅读(351)  评论(0编辑  收藏  举报