二级指针做输入的三种内存模型(二)

二级指针做输入的第二种内存模型:

#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个字节,这就是多维数组的本质,编译器只会关心多维数组的行数和列数。

猜你喜欢

转载自blog.csdn.net/wang_zhao_/article/details/80631706
今日推荐