what is separate-array-of-pointers technique? when and where can it be used?
here I will explain it.
separate-array-of-pointers is a array of pointers each of which points at one element of another array.when we sort a array whose elements may be a large structure,it may be useful. As the array is sorted ,it will spend much time. Beause a lot of data will be copied back and forth.we can exploite separate-array-of-pointers technique.

/**//*
* demonstrate the use of separate-array-of-pointers technique.
*
*/
#include <stdio.h>
#include <stdlib.h>


struct employee
{
char name[20];
long emp_id;
};
int emp_pointer_name_compare(const void *e1p,const void *e2p)


{
const struct employee **e1,**e2;
e1=(const struct employee* *) (e1p); //it is hard to understand?
e2=(const struct employee* *) (e2p);
return strcmp((*e1)->name,(*e2)->name);
}

/**//*
int emp_name_compare(const void *e1p,const void * e2p)
{
const struct employee *e1,*e2;
e1=(const struct employee* ) (e1p); //it is hard to understand?
e2=(const struct employee* ) (e2p);
return strcmp(e1->name,e2->name);
}*/
int main()


{
struct employee employees[10];
struct employee *pemployees[10];
char buf[BUFSIZ];
int i,nep;
for(nep=0;nep<3 &&fgets(buf,BUFSIZ,stdin)!=NULL;nep++)


{
sscanf(buf,"%s %ld\n",&employees[nep].name,
&employees[nep].emp_id);
pemployees[nep]=&employees[nep];
}
qsort(pemployees,nep,sizeof(struct employee *),emp_pointer_name_compare);


/**//*qsort(employees,nep,sizeof(struct employee),emp__name_compare);*/

printf("Sorted by name:");
for(i=0;i<nep;i++)


{
printf("%s %ld \n",pemployees[i]->name,pemployees[i]->emp_id);
}
scanf("%d",&i);
return 0;
}
