歡迎您光臨本站 註冊首頁

詳解C語言-二級指針三種內存模型_C 語言

←手機掃碼閱讀     月球人 @ 2020-06-11 , reply:0

二級指針相對於一級指針,顯得更難,難在於指針和數組的混合,定義不同類型的二級指針,在使用的時候有著很大的區別

第一種內存模型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  ", 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  ", pArray[i]);  	}  	return 0;  }

 

第三種內存模型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

 

如果要打印這個數組,那麼可以使用以下函數

  {  	int i = 0;  	if (pArray == NULL)  	{  		return -1;  	}  	for (i = 0; i < num; i++)  	{  		printf("%s  ", pArray[i]);  	}  	return 0;  }

 

例子

把第一種內存模型的數據排序,運算結果放到第三種內存模型中

  #include "stdio.h"  #include "string.h"  #include "stdlib.h"    char **SortArrayAndGen3Mem(const char ** const myArray1, int num, char *str, int *myNum)  {  	char **p = NULL;  		p= (char **)malloc(num*sizeof(char *));  	if (myArray1==NULL || str==NULL|| myNum==NULL)  	{  		printf("傳入參數錯誤 ");  		p = NULL;  		goto END;  	}  	*myNum = num;  	for (int i = 0; i < num;i++)  	{  		p[i] = NULL;  		p[i] = (char)malloc(50 * sizeof(char));  		memset(p[i], 0, sizeof(p[i]));  		if (p[i]==NULL)  		{  			printf("內存分配錯誤! ");  			goto END;  		}  		strcpy(p[i], myArray1[i]);  	}  	char *tmp;  	for (int i = 0; i < num; i++)  	{  		for (int j = i + 1; j < num; j++)  		{  			if (strcmp(p[i],p[j])>0)  			{  				char *tmp = p[i];  				p[i] = p[j];  				p[j] = tmp;  			}  		}  	}  	for (int i = 0; i < num; i++)  	{  		printf("%s  ", myArray1[i]);  	}    END:  	return p;  }    //釋放內存函數    void main()  {  	int i = 0;  	char **myArray3 = NULL;  	int num3 = 0;  	//第一種內存模型  	char *myArray[] = {"bbbbb", "aaaaa", "cccccc"};  	char *myp = "111111111111";    	myArray3 = SortArrayAndGen3Mem(myArray, 3, myp, &num3);    	for (i=0; i<num3; i++)  	{  		printf("%s  ", myArray3[i]);  	}    	system("pause");  }  #include "stdio.h"  #include "stdlib.h"  #include "string.h"    char **SortArrayAndGet3Mem(const char* const myArray1,int num,char *str,int *myNum);  int getArray(char ***newp,int num) ;  int freeArray(char ***newpfree,int num);  int sortTArray(char *p, int num);    void main()  {  	char **myArray3=NULL;  	int num3=0;  	char *myArray[]={"bbbb","aaa","cccc"};  	char *myp="111111111";  	myArray3=SortArrayAndGet3Mem(myArray,3,myp,&num3);  	system("pause");  }      char **SortArrayAndGet3Mem(const char** const myArray1,int num,char *str,int *myNum)  {  	int ret=0;  	char **p=NULL;  	int i=0;  	char **p1=NULL;  	p1=(char **)myArray1;  	ret=getArray(&p,num +1);  	for (i=0;i<num;i++)  	{  		strcpy(p[i],p1[i]);  	}  	strcpy(p[i], str);  	ret=sortTArray(p,num +1);  	for (i=0;i<num +1;i++)  	{  		printf("%s ",p[i]);  	}  	ret=freeArray(&p,num +1);  	*myNum = num +1;  	return p;  }    int getArray(char ***newp,int num)   {  	int i=0;  	int ret=0;  	char **tmp = NULL;  	tmp = (char **)malloc(num*sizeof(char *));  	for (i=0;i<num;i++)  	{  		tmp[i]=(char*)malloc(sizeof(char)*100);  	}  	*newp = tmp; //  	return 0;  }    //  int freeArray(char ***newpfree,int num)  {  	char **p=NULL;  	int i=0;  	int ret=0;  	p=*newpfree;  	for (i=0;i<num;i++)  	{  		free(p[i]);  	}  	free(p);  	*newpfree = NULL; //  	return ret;  }    //int sortTArray(char ***Arraystr, int num)  int sortTArray(char **Arraystr, int num)  {  	int i , j = 0;   	for (i=0; i<num; i++)  	{  		for (j=i+1; j0)  			{  				char tmp[100];  				strcpy(tmp,(Arraystr)[i]);  				strcpy((Arraystr)[i],(Arraystr)[j]);  				strcpy((Arraystr)[j],tmp);  			}  		}  	}  	for (i=0;i<num;i++)  	{  		printf("%s ",(Arraystr)[i]);  	}  	return 0;  }



[月球人 ] 詳解C語言-二級指針三種內存模型_C 語言已經有235次圍觀

http://coctec.com/docs/c/language/show-post-238095.html