第三中内存模型的图示如下:
首先需要一个指针指向一个数组,该数组的元素为指针,数组内的指针指向字符串。
#include<stdio.h> int main() { char **p; int num=3,i; p=(char **)malloc(sizeof(char*)); for(i=0;i<num;i++) { p[i]=(char*)malloc(sizeof(char)*100); } strcpy(p[0],"111"); strcpy(p[1],"333"); strcpy(p[2],"222"); }
这样呢,p[0]、p[1]和p[2],就分别指向了上面三个字符串。
接下来我们就行字符串的打印,如下:
#include<stdio.h>
int main()
{
char **p;
int num=3,i;
p=(char **)malloc(sizeof(char*);
for(i=0;i<num;i++)
{
p[i]=(char*)malloc(sizeof(char)*100));
}
strcpy(p[0],"111");
strcpy(p[1],"333");
strcpy(p[2],"222");
for(i=0;i<num;i++)
printf("%s\n",p[i]);
}
这样呢,我们就完成了字符串的打印。当我们不需要那些动态分配的内存时,是不是需要释放呢?释放代码如下:
#include<stdio.h>
int main()
{
char **p;
int num=3,i;
p=(char **)malloc(sizeof(char*);
for(i=0;i<num;i++)
{
p[i]=(char*)malloc(sizeof(char)*100));
}
strcpy(p[0],"111");
strcpy(p[1],"333");
strcpy(p[2],"222");
for(i=0;i<num;i++)
printf("%s\n",p[i]);
for(i=0;i<num;i++)
{
if(p[i]!=NULL)
free(p[i]);
}
if(p!=NULL)
free(p);
}
释放的方法是谁是最后分配的就先释放谁,是不是和栈类似呢?
接下来进行排序,排序方法有两种,一种交换指针,另一种交换内存空间。交换指针代码如下:
#include<stdio.h> int main() { char **p; char *temp; int num=3,i,j; p=(char **)malloc(sizeof(char*); for(i=0;i<num;i++) { p[i]=(char*)malloc(sizeof(char)*100)); } strcpy(p[0],"111"); strcpy(p[1],"333"); strcpy(p[2],"222"); for(i=0;i<num;i++) { for(j=i+1;j<num;j++) { if(strcmp(p[i],p[j])>0) { temp=p[i]; p[i]=p[j]; p[j]=temp; } } } }
这样我们就完成了通过交换指针实现对字符串的排序,接下来进行交换内存空间:
#include<stdio.h> int main() { char **p; char temp[100]; int num=3,i,j; p=(char **)malloc(sizeof(char*); for(i=0;i<num;i++) { p[i]=(char*)malloc(sizeof(char)*100)); } strcpy(p[0],"111"); strcpy(p[1],"333"); strcpy(p[2],"222"); for(i=0;i<num;i++) { for(j=i+1;j<num;j++) { if(strcmp(p[i],p[j])>0) { strcpy(temp,p[i]); strcpy(p[i],p[j]); strcpy(p[j],temp); } } } }
上面我们通过交换内存空间实现字符串的排序。
接下来进行自定义函数打印,代码如下:
扫描二维码关注公众号,回复:
1615519 查看本文章
#include<stdio.h> void print(char **p,int num) { int i; for(i=0;i<num;i++) printf("%s\n",p[i]); } int main() { char **p; int num=3,i; p=(char **)malloc(sizeof(char*)); for(i=0;i<num;i++) { p[i]=(char*)malloc(sizeof(char)*100); } strcpy(p[0],"111"); strcpy(p[1],"333"); strcpy(p[2],"222"); print(p,num); }
接下来进行自定义函数第一种排序:
#include<stdio.h> void sort(char **p,int num) { char *temp; int i,j; for(i=0;i<num;i++) { for(j=i+1;j<num;j++) { if(strcmp(p[i],p[j])>0) { temp=p[i]; p[i]=p[j]; p[j]=temp; } } } } int main() { char **p; int num=3,i; p=(char **)malloc(sizeof(char*)); for(i=0;i<num;i++) { p[i]=(char*)malloc(sizeof(char)*100); } strcpy(p[0],"111"); strcpy(p[1],"333"); strcpy(p[2],"222"); sort(p,num); }
接下来进行第二种排序:
#include<stdio.h> void sort(char **p,int num) { char temp[100]; int i,j; for(i=0;i<num;i++) { for(j=i+1;j<num;j++) { if(strcmp(p[i],p[j])>0) { strcpy(temp,p[i]); strcpy(p[i],p[j]); strcpy(p[j],temp); } } } } int main() { char **p; int num=3,i; p=(char **)malloc(sizeof(char*)); for(i=0;i<num;i++) { p[i]=(char*)malloc(sizeof(char)*100); } strcpy(p[0],"111"); strcpy(p[1],"333"); strcpy(p[2],"222"); sort(p,num); }二级指针做输入的三种内存模型至此结束,如有错误,欢迎批评指出。