二级指针做输入的第一种内存模型:
在上面的代码中buffer[ ]是不是一个数组呢?很明显是。只不过buffer[ ]中的每一个元素都是指针,也就是我们所说的指针数组。
#include<stdio.h> int main() { char *buffer[]={"111","333","222"}; }
在上面的代码中buffer[ ]是不是一个数组呢?很明显是。只不过buffer[ ]中的每一个元素都是指针,也就是我们所说的指针数组。
首先我们进行打印,代码如下:
#include<stdio.h> int main() { int i,num; char *buffer[]={"111","333","222"}; num=sizeof(buffer)/sizeof(buffer[0]);//求数组长度 for(i=0;i<num;i++) { printf("%s"\n,buffer[i]); //或printf("%s"\n,*(bufer+i)。因为buffer[i]是不是等价于*(buffer+i)呢? } }
我们如何对上面的元素进行排序呢?代码如下:
#include<stdio.h> #include<string.h> int main() { int i,j,num; char *buffer[]={"111","333","222"}; char *temp; num=sizeof(buffer)/sizeof(buffer[0]); for(i=0;i<num;i++) { for(j=i;j<num;j++) { if(strcmp(buffer[i],buffer[j])>0) { temp=buffer[i]; //temp是指针 buffer[i]=buffer[j]; buffer[j]=temp; } } } }
这样我们是不是通过交换指针实现了排序?也就是说交换了buffer中的元素。
在上述代码中,我们都是在main()中实现打印及排序,但为了使程序的可移植性更高,我们是不是应该自定义函数,实现上述功能呢?
自定义打印代码如下:
#include<stdio.h> void print(char **buffer,int num) { int i;
for(i=0;i<num;i++) { printf("%s"\n,buffer[i]); //或printf("%s"\n,*(bufer+i)。因为buffer[i]是不是等价于*(buffer+i)呢? }}
int main(){
int num;
char *buffer[]={"111","333","222"};
num=sizeof(buffer)/sizeof(buffer[0]); print(buffer,num); }
这样我们就实现了自定义函数打印二级指针的值。接下来我们进行排序:
#include<stdio.h> void sort(char **buffer,int num) { char *temp; int i;
for(i=0;i<num;i++) { for(j=i;j<num;j++) { if(strcmp(buffer[i],buffer[j])>0) { temp=buffer[i]; //temp是指针 buffer[i]=buffer[j]; buffer[j]=temp; } } } }int main()
{
int num;
char *buffer[]={"111","333","222"};
num=sizeof(buffer)/sizeof(buffer[0]); sort(buffer,num); }
这样我们就实现了自定义函数实现二级指针的排序。内存模型图如下: