1. 程式人生 > 程式設計 >詳解C語言-二級指標三種記憶體模型

詳解C語言-二級指標三種記憶體模型

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

第一種記憶體模型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 \n",pArray[i]);
	}
	return 0;
}

第二種記憶體模型char arr[][]

若有如下定義

char arr[3][5] = {"abc","ghi"};

這種模型為二級指標的第二種記憶體模型,在理解的時候應該這樣理解:定義了一個二維陣列,有3個(5個char)空間的儲存變數。

在使用的時候,若要使用中間量操作元素,那麼此時中間量應該定義為

char tmp[5] = { 0 };

如果要列印這個陣列,那麼可以使用以下函式

nt printAarray(char pArray[][5],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 \n",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("傳入引數錯誤\n");
		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],sizeof(p[i]));
		if (p[i]==NULL)
		{
			printf("記憶體分配錯誤!\n");
			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 \n",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 \n",myArray3[i]);
	}

	system("pause");
}
#include "stdio.h"
#include "stdlib.h"
#include "string.h"

char **SortArrayAndGet3Mem(const char* const myArray1,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,&num3);
	system("pause");
}


char **SortArrayAndGet3Mem(const char** const myArray1,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\n",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; j<num; j++)
		{
			if (strcmp((Arraystr)[i],(Arraystr)[j])>0)
			{
				char tmp[100];
				strcpy(tmp,(Arraystr)[i]);
				strcpy((Arraystr)[i],(Arraystr)[j]);
				strcpy((Arraystr)[j],tmp);
			}
		}
	}
	for (i=0;i<num;i++)
	{
		printf("%s\n",(Arraystr)[i]);
	}
	return 0;
}

以上就是詳解C語言-二級指標三種記憶體模型的詳細內容,更多關於C語言-二級指標三種記憶體模型的資料請關注我們其它相關文章!