c语言指针函数相关问题

#include<stdio.h>
#include<string.h>
void main(){
char tmp[81], a[6][81] = {"chemical", "biotech", "materials",
"computer", "information", "public admin"};
int i,j,k;
for(i=0; i<5; i++){
k = i;
for(j = i+1; j<6; j++)
if(strcmp(*(a+j), *(a+k))>0) k = j;
strcpy(tmp, (a+i));
strcpy(a[i], a[k]);
strcpy((a+k),tmp);
}
for(i = 0; i<3; i++) puts(a[i]);
}
整个程序要怎么看 if(strcmp(*(a+j), *(a+k))>0) k = j;这个语句什么意思

这个程序就是对字符串数组a中的数组进行从小到大的排序
if(strcmp( * (a+j), * (a+k))>0) k = j
就是当a+j这个字符串比a+k这个字符串大时,要进行交换。后面strcpy就是进行交换

a作为数组名,大部分情况下代表数组首地址,特殊&,sizeof情况下才是整个数组。
a+i , 是首地址便宜i个位置的地方,可以理解成数组偏移或者指针偏移。
*(a+i), 是指首地址偏移I后的地址所保留的值,也就是数组内容的比较

可以查看手册:c语言--指针声明 中的内容