二級指針和多級指針專題

二級指針三種內存模型

二級指針做輸入_第1種內存模型

//操作指針數組,通常會用到多級指針
//多級指針的用法與一級指針相同
//*p定義了一個指針變量;p是指針變量,表示內存空間的地址(不是值);*p表示根據這個地址操作值
void main00()
{
	int		i = 0, j = 0;
	int		num = 0;
	char	*tmp = NULL;
	//數組 數組中的每一個元素是指針 指針數組
	char *myArray[] = {"aaaaaa", "ccccc", "bbbbbb", "111111"};

	//打印
	num = sizeof(myArray)/sizeof(myArray[0]);
	printf("排序之前\n");
	for (i=0; i<num; i++)
	{
		//printf("%s \n", myArray[i]);
		printf("%s \n", *(myArray+i) );
	}

	//排序
	for (i=0; i<num; i++)
	{
		for (j=i; j<num; j++)
		{
			if (strcmp(myArray[i], myArray[j]) > 0 )
			{
				tmp = myArray[i];  //注意  交換的是數組元素 交換的是指針的值
				myArray[i] = myArray[j];
				myArray[j] = tmp;
			}
		}
	}

	printf("排序之後\n");
	for (i=0; i<num; i++)
	{
		//printf("%s \n", myArray[i]);
		printf("%s \n", *(myArray+i) );
	}
	printf("hello...\n");
	system("pause");
	return ;
}

//改變指針的指向,就是建立關聯,只需要指針變量p(不是*p),根據地址操作值時需要*p(不是p)
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) );
	}
}

void sortMyArray11(char **myArray, int num)
{
	int i =0 , j = 0;
	char *tmp = NULL;
	//排序
	for (i=0; i<num; i++)
	{
		for (j=i; j<num; j++)
		{
			if (strcmp(myArray[i], myArray[j]) > 0 )
			{   //這不是指針賦值,不滿足三個條件,myArray[i]是個值不是地址
                //爲什麼要用指針變量tmp?因爲等號兩邊數據類型必須相同
				tmp = myArray[i];  //注意  交換的是數組元素 交換的是指針的值 //改變指針的指向
				myArray[i] = myArray[j];
				myArray[j] = tmp;
			}
		}
	}
}

void main01()
{
	int		i = 0, j = 0;
	int		num = 0;
	char	*tmp = NULL;
	//數組 數組中的每一個元素是指針 指針數組
	char *myArray[] = {"aaaaaa", "ccccc", "bbbbbb", "111111"};

	//打印
	num = sizeof(myArray)/sizeof(myArray[0]);
	printf("排序之前\n");
	printMyArray11(myArray, num);
	sortMyArray11(myArray, num);
	printf("排序之後\n");
	printMyArray11(myArray, num);

	printf("hello...\n");
	system("pause");
	return ;
}

 二級指針的第二種內存模型

//打印  排序 //封裝成函數
void main00()
{
	int i = 0, j = 0;
	int num = 4;
	char myBuf[30];
	char tmpBuf[30];
	char myArray[10][30] = {"aaaaaa", "ccccc", "bbbbbbb", "1111111111111"};
	printf("排序之前\n");
	for (i=0; i<num; i++)
	{
		printf("%s\n", myArray[i]);
	}
	for (i=0; i<num; i++)
	{
		for (j=i+1; j<num; j++)
		{
			if (strcmp (myArray[i],  myArray[j]) > 0)
			{
				strcpy(tmpBuf, myArray[i]);  //交換的是內存塊
				strcpy(myArray[i], myArray[j]);
				strcpy(myArray[j], tmpBuf);
			}
		}
	}
	printf("排序之後\n");
	for (i=0; i<num; i++)
	{
		printf("%s\n", myArray[i]);
	}
	printf("hello...\n");
	system("pause");
	return ;
}

//問題的本質是:dm03_二級指針做輸入_第2種內存模型 的 myArray + 1
// dm03_二級指針做輸入_第1種內存模型   myArray + 1 不一樣 ;
//指針的步長不一樣  指針所指向的內存空間的數據類不一樣 。。。。
//在c中輸出指針數組只能使用遍歷方式進行,而且需要注意指針步長的不同,指針步長取決於數組數據類型
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) );  //
	}
}

//交換的是內存塊。。。。。。。。
void sortMyArray02(char myArray[10][30], int num)
{
	int i, j = 0;
	char tmpBuf[30];
	for (i=0; i<num; i++)
	{
		for (j=i+1; j<num; j++)
		{
			if (strcmp (myArray[i],  myArray[j]) > 0)
			{
				strcpy(tmpBuf, myArray[i]);  //交換的是內存塊
				strcpy(myArray[i], myArray[j]);
				strcpy(myArray[j], tmpBuf);
			}
		}
	}

}

//打印  排序 //封裝成函數
void main01()
{
	int i = 0, j = 0;
	int num = 4;
	char myBuf[30];
	char tmpBuf[30];
	char myArray[10][30] = {"aaaaaa", "ccccc", "bbbbbbb", "1111111111111"};

	//myArray: 編譯器只會關心:有10行 ,每行30列。。。。。幹什麼?myArray+1  多維數組名的本質,
	{
		int len1 = sizeof(myArray);
		int len2 = sizeof(myArray[0]);
		int size = len1/len2;
		printf("len1:%d , len2:%d  size:%d \n", len1, len2, size);

	}
	printf("排序之前\n");
	printMyArray02(myArray, num);
	sortMyArray02(myArray, num);
	printf("排序之後\n");
	printMyArray02(myArray, num);
	printf("hello...\n");
	system("pause");
	return ;
}

二級指針做輸入_第3種內存模型

void main00()
{
	int i = 0, j = 0;
	char **p2 = NULL;
	int num = 5;
	char *tmp = NULL;
	char tmpbuf[100];
	p2 = (char **)malloc(sizeof(char *) * num);

	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);
	}

	//排序之前 
	printf("排序之前\n");
	for (i=0; i<num; i++)
	{
		printf("%s \n", p2[i]);
	}

	//排序 交換的是 :指針
	/*
	for (i=0; i<num; i++)
	{
		for (j=i+1; j<num; j++)
		{
			if (strcmp( p2[i] , p2[j]) < 0)
			{
				tmp = p2[i];
				p2[i] = p2[j];
				p2[j] = tmp;
			}
		}
	}
	*/

	//排序 交換的時候內存
	for (i=0; i<num; i++)
	{
		for (j=i+1; j<num; j++)
		{
			if (strcmp( p2[i] , p2[j]) < 0)
			{
				strcpy(tmpbuf, p2[i]);
				strcpy( p2[i], p2[j]);
				strcpy( p2[j], tmpbuf);
			}
		}
	}

	//排序之前 
	printf("排序之後\n");
	for (i=0; i<num; i++)
	{
		printf("%s \n", p2[i]);
	}
	//釋放內存
	for(i=0; i<num; i++)
	{
		if (p2[i] != NULL)
		{
			free(p2[i]);
			p2[i] = NULL;
		}
	}
	if (p2!=NULL) 
	{
		free(p2);
	}
	printf("hello...\n");
	system("pause");
	return ;
}

char **getMem41(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;
}

void printMyArray03(char **myArray, int num)
{
	int i = 0;
	for (i=0; i<num; i++)
	{
		//printf("%s \n", myArray[i]);
		printf("%s \n", *(myArray+i) );
	}
}
void sortMyArray03(char **myArray, int num)
{
	int i =0 , j = 0;
	char *tmp = NULL;
	//排序
	for (i=0; i<num; i++)
	{
		for (j=i; j<num; j++)
		{
			if (strcmp(myArray[i], myArray[j]) > 0 )
			{
				tmp = myArray[i];  //注意  交換的是數組元素 交換的是指針的值 //改變指針的指向
				myArray[i] = myArray[j];
				myArray[j] = tmp;
			}
		}
	}
}
void getMem41_Free(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);
	}
}

void main01()
{
	int i = 0, j = 0;
	char **p2 = NULL;
	int num = 5;
	char *tmp = NULL;
	char tmpbuf[100];
	p2 = getMem41(num);
	//排序之前 
	printf("排序之前\n");
	printMyArray03(p2, num);
	sortMyArray03(p2, num);
	//排序 交換的是 :指針
	/*
	for (i=0; i<num; i++)
	{
		for (j=i+1; j<num; j++)
		{
			if (strcmp( p2[i] , p2[j]) < 0)
			{
				tmp = p2[i];
				p2[i] = p2[j];
				p2[j] = tmp;
			}
		}
	}
	*/
	//排序之前 
	printf("排序之後\n");
	printMyArray03(p2, num);
	getMem41_Free(p2,  num); //p2是一個野指針
	printf("hello...\n");
	system("pause");
	return ;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章