指向指针的指针 字符串数组

img


img

求解释一下图示里p指针的含义,指向的是什么。以及定义函数中*(p+i)的意思。定义函数是如何用冒泡法对5个字符串排序的。

p指向一个字符串数组,或者说是二维字符数组
*p表示字符串数组的首地址的值,也就是第一个字符串
*(p + i)就表示第i+1个字符串

p指向数组中的字符串,也就是多个元素
*(p+i)相当于p[][i]
冒泡排序中用的scrtmp函数比较字符串,然后排序

下面是我的理解,不一定正确,供你参考,如下:


#include <stdio.h>
#include <string.h>
#define LINEMAX 20
int main(){
    void sort(char **p);
    
    int i;
    char **p,*pstr[5],str[5][LINEMAX];
    
    for(i=0;i<5;i++){
        pstr[i] = str[i];   //把指针数组依次赋值为二维数组str的行指针 
    }
    
    printf("input 5 strings:\n");
    for(i=0;i<5;i++){
        scanf("%s",pstr[i]);  //存放在这五个地址存放一个字符串 
    }
    
    p = pstr;  //p赋值为指向这个指针数组 
    
    sort(p);
    printf("\nstrings sorted:\n");
    
    for(i=0;i<5;i++){
        printf("%s\n",pstr[i]);
    }
    
    return 0;
}

void sort (char **p){
    int i,j;
    
    char * temp;
    for(i=0;i<5;i++){
        for(j=i+1;j<5;j++){
        //    printf("before change :*(p+i)=%s,*(p+j)=%s\n",*(p+i),*(p+j));
            //p+i为下标为i的指针数组的指针,*(p+i)为取下标为i的指针指向的字符串 
            //p+j为下标为j的指针数组的指针,*(p+j)为取下标为j的指针指向的字符串 
            //比较这两个指针指向的字符串 ,然后交换他们的值-指针值,把他们存放字符串的地址值交换
            //达到排序字符串的目的 
            if(strcmp(*(p+i),*(p+j))>0){
                temp=*(p+i);
                *(p+i) = *(p+j);
                *(p+j) = temp;
            }
        
        }
    }
}