二级指针做输入的第二种内存模型:
#include<stdio.h>
int main()
{
char buffer[10][20]={"111","333","222"};
}
上面的buffer是不是一个字符串数组呢?它是不是也相当于一个二级指针呢?同样我们实现二级指针的打印,排序,并自定义函数实现上述功能?
#include<stdio.h>
int main()
{
int i,num=4;
char buffer[10][20]={"111","333","222"};
for(i=0;i<num;i++)
{
printf("%s\n",buffer[i]);
}
}
这样我们就实现了字符串数组的打印,接下来进行排序:
#include<stdio.h>
int main()
{
int i,j,num=4;
char buffer[10][20]={"111","333","222"};
char temp[20];
for(i=0;i<num;i++)
{
for(j=i+1;j<num;j++)
{
if(strcmp(buffer[i],buffer[j])>0)
{
strcpy(temp,buffer[i]);
strcpy(buffer[i],buffer[j]);
strcpy(buffer[j],buffer[i]);
}
}
}
}
这样呢我们就实现了字符串数组的排序,与第一种内存模型不同的是,我们这里交换的不是指针的值,而是指针所指向的字符串。
那么,接下来我们自定义函数来实现上述功能。我们先想一下可不可以用第一种内存模型所定义的函数进行打印?
#include<stdio.h>
void print(char **buffer,int num)
{
int i;
for(i=0;i<num;i++)
{
printf("%s\n",buffer[i]);
}
}
int main()
{
int i,num=4;
char buffer[10][20]={"111","333","222"};
print(buffer,num);
}
答案是不可以的。因为第二种内存模型的buffer+1和第一种内存模型的buffer+1的本质是不同的,两者的步长是不相同的?因为指针所指向内存空间的数据类型是不一样的。那么这种内存模型应该怎么办呢?二维数组是如何传递参数的?
#include<stdio.h>
void print(char buffer[][20],int num)
{
int i;
for(i=0;i<num;i++)
{
printf("%s\n",buffer[i]);
}
}
int main()
{
int i,num=4;
char buffer[10][20]={"111","333","222"};
print(buffer,num);
}
二维数组是不是按上面的方式进行参数传递的呢?所以我们可以按照上面的方式进行这种内存模型的打印。接下来进行排序:
#include<stdio.h>
void sort(char buffer[][20],int num)
{
int i,j;
char temp[20];
for(i=0;i<num;i++)
{
for(j=i+1;j<num;j++)
{
if(strcmp(buffer[i],buffer[j])>0)
{
strcpy(temp,buffer[i]); //交换的是数据块
strcpy(buffer[i],buffer[j]);
strcpy(buffer[j],buffer[i]);
}
}
}
}
int main()
{
int num=4;
char buffer[10][20]={"111","333","222"};
char temp[20];
sort(buffer,num);
}
这样呢,我们就实现了排序。那么我们可不可向第一种内存模型一样,另num=sizeof(buffer)/sizeof(buffer[0])呢?结果是多少?
答案是10,buffer+1指针会向后移动20个字节,这就是多维数组的本质,编译器只会关心多维数组的行数和列数。