指针做输入:主调函数分配内存
指针做输出:被调函数分配内存
3.2 二级指针做输入的第一种内存模型· 1.指针数组:数组中的每一个元素都是一个指针
形如:char *myArray[] = {"aaa",bbb","ccc","ddd"};
内存模型:
注:1)myArray代表 数组myArray的首地址;
2)*myArray等价于myArray[0],若以%s的形式输出,则输出myArray[0]中保存的地址中所存储的元素,即打印“aaa”。若以%d的形式输入,则打印的是0x2233即myArray[0]中保存的地址。
3) *(myArray+1)等价于myArray[1] ;
2.定义函数实现{ "xxxx","bbbb","gggg","dddd" }的排序操作
int sortArray(char **initArray,int num)
{
int ret = 0;
int i, j;
char* temp=NULL;
if (*initArray == NULL)
{
ret = -1;
return ret;
}
//排序
for (i = 0; i < num; i++)
{
for (j = i + 1; j < num; j++)
{
if (strcmp(initArray[i], initArray[j]) > 0)//比较内存指向的数据
{
//交换数组中保存的内存地址,相当于改变指针的指向
temp = initArray[i];
initArray[i] = initArray[j];
initArray[j] = temp;
}
}
}
return ret;
}
void printArray(char** initArray,int num)
{
int i, j;
for (i = 0; i < num; i++)
{
printf("%sn", initArray[i]);
}
}
void main()
{
//数组 数组中的每一个元素是指针 指针数组
int ret = 0;
char* myArray[] = { "xxxx","bbbb","gggg","dddd" };
int num = sizeof(myArray) / sizeof(myArray[0]);
//打印
printf("排序前:n");
printArray(myArray, num);
//排序
ret = sortArray(myArray, num);
printf("排序后:n");
printArray(myArray,num);
system("pause");
return;
}
内存模型示例:
3.3 指针做函数参数的第二种内存模型
1.内存模型的实例图
2.定义函数实现{ "xxxx","bbbb","gggg","dddd" }的排序操作
int sortArray1(char initArray[10][30], int num)
{
int ret = 0;
char tempBuf[30];
int i, j;
if (initArray == NULL)
{
ret = -1;
return ret;
}
for (i = 0; i < num; i++)
{
for (j = i + 1; j < num; j++)
{
if (strcmp(initArray[i], initArray[j]) > 0)
{
strcpy(tempBuf, initArray[i]);//交换的内存块的数据
strcpy(initArray[i], initArray[j]);
strcpy(initArray[j], tempBuf);
}
}
}
return ret;
}
void printArray1(char initArray[10][30], int num)
{
int i;
for (i = 0; i < num; i++)
{
printf("%sn", *(initArray + i));
//printf("%sn", initArray[i]);
}
}
void main()
{
int ret = 0;
int num = 4;
char myArray[10][30]={"ssss","2222","gggggg","88888"};
//打印操作
printf("排序之前:");
printArray1(myArray, num);
//排序操作
printf("排序之后:");
ret=sortArray1(myArray,num);
printf("排序之后:n");
printArray1(myArray, num);
system("pause");
return;
}
3.4 二级指针做输入的第一种内存模型
1.内存模型实例图
2.封装函数实现第三种内存模型
//内存开辟函数
char** signMemo(int num)
{
int i;
char** p = NULL;
//开辟一级数组内存块,数组中存储的地址
p = (char**)malloc(sizeof(char*) * num);
//开辟二级数组内存
for (i = 0; i < num; i++)
{
p[i] = (char*)malloc(sizeof(char) * 100);
//初始化内存数组
sprintf(p[i], "%d%d%d", i + 1, i + 1, i + 1);
}
return p;
}
//输出函数
void printArr(char** initArr, int num)
{
int i;
for (i = 0; i < num; i++)
{
// printf("%sn", initArr[i]);
printf("%sn", *(initArr + i));
}
}
//排序算法
int sortArr(char** initArr, int num)
{
int i,j;
char* temp;
char tempBuf[100];//交换数据的临时变量
//交换内存地址实现排序
for (i = 0; i < num; i++)
{
for (j = i+1; j < num; j++)
{
if (strcmp(initArr[i], initArr[j]) < 0)
{
temp = initArr[i];
initArr[i] = initArr[j];
initArr[j] = temp;
}
}
}
}
//内存空间的释放
void free_Memo(char** p,int num)
{
int i;
//释放第二层内存
for (i = 0; i < num; i++)
{
if (p[i] != NULL)
{
free(p[i]);
p[i] = NULL;
}
}
//释放第一层内存
if (p != NULL)
{
free(p);
p = NULL;
}
}
void main()
{
char** p = NULL;
int num = 5;
int i,j;
char* temp;//交换内存地址的临时变量
p = signMemo(num);
printf("排序前:n");
//调用打印函数
printArr(p, num);
//调用排序函数
sortArr(p, num);
printf("排序后:n");
//调用打印函数
printArr(p, num);
//释放堆区内存
free_Memo(p, num);
system("pause");
return;
}



