By declaring char *a[] = {"aa”,“bb"},we get a memory layout

By declaring char ttt[3][3] = {...}, we get a memory layerout
所以前者获得的不是连续内存,而后者是连续内存。a[0]存放的是指向char *类型的指针,而ttt[0][0]存放就是字符内容(char)。a的地址和a[0]不同,而ttt的地址和k的地址一样。当声明char *pa = (char *)a, char * pt = (char *)ttt的时候,pa的地址等于a的地址,pt的地址和ttt的地址一样。由于a[0]的类型为char *,所以pa的类型转换为为(char **)后就可以获得一个指向string的指针。由此引出qsort函数的使用问题,重点当然是compare函数的区别。直接上列子,^_^
1.
char a[1000][20];
qsort(a,1000,sizeof(char)*20,comp);
int comp(const void *a,const void *b
{
return strcmp((char *)a,(char *)b);
}
qsort(a,1000,sizeof(char)*20,comp);
int comp(const void *a,const void *b
{
return strcmp((char *)a,(char *)b);
}
2.
char* a[] = {....};
int cmp (const void *a , const void *b ){
return strcmp(*(char**)a, *(char**)b);
}
return strcmp(*(char**)a, *(char**)b);
}
地址的区别例子
#include <stdio.h>
int main() {
char *a[] = {"aa", "bb", "cc"};
char k[3][3] = {"aa", "bb", "cc"};
int i;
char *pa = (char *)a;
int *pINT = (int *)a;
char *pk = (char *)k;
for (i = 0; i < 3; i++) {
printf("a[%d]: %x, ", i, a[i]);
printf("k[%d]: %x \n", i, k[i]);
}
printf("a: %x, ", a);
printf("k: %x\n", k);
printf("pa: %x, ", pa);
printf("pk: %x\n", pk);
printf("*pa: %x, ", *pa);
printf("(char **)pa :%x, ", *(char **)pa);
printf("*pa: %x, ", *pa);
printf("*pk: %x \n", *pk);
printf("pINT %x\n", pINT);
// get second element!
printf("%s\n", *((char **)(pa + sizeof(a[0]))));
return 0;
}