#include
int main()
{
/*char *a[];由于[]的优先级高于*所以a先和[]结合,他还是一个数组
//数组中的元素才是char *,所以是一个指针数组!!里面保存的是地址!
//可以看到数组中的四个元素保存了四个内存地址,这四个地址中就代表
//了四个字符串的首地址,而不是字符串本身。
注意这四个地址是不连续的,它是编译器为"China","French","America","German"
分配的内存空间的地址, 所以,四个地址没有关联*/
int i ;
char * a[]={"China","French","America","German"};
char **s = a;
printf("数组名a的地址:%p,&a[0]即数组元素内存单元本身的地址:%p\n",a,&a[0]);
printf("*a=%s,a[0]=%s\n",*a,a[0]);
printf("a[0]保存的China的地址:%p a[1]保存French的地址:%p\na[2]保存America的地址:%p a[3]保c存German的地址:%p\n",a[0],a[1],a[2],a[3]);//数组元素中保存的地址,不连续
printf("sizeof(a)=%d\n",sizeof(a));
printf("数组元素单元本身的地址每个相差4:%p %p %p %p\n",&a[0],&a[1],&a[2],&a[3]);//数组元素单元本身的地址
//为什么能把 a赋给s,因为数组名a代表数组元素内存单元的首地址,
//即 a = &a[0] = 0012FF38;
printf("*s=%s\n",*s); //China
printf("a[0]=%s\n",a[0]);
printf("*a=%s\n",*a);
//但还是要注意,不能a = s,前面已经说到,a 是一个常量。
printf("*(s[0])=%c,*(s[1])=%c\n",*(s[0]),*(s[1]));//C F
printf("strlen(*s)=%d,strlen(s[1])=%d,strlen(*(s+1))=%d\n",strlen(*s),strlen(s[1]),strlen(*(s+1)));
printf("*(s+1)=%s\n",*(s+1));
for( i=0;i
printf("%c ",*(*(s+0)+i));
//printf("%c ",a[0][i]);//2中方法
}
/*
char **s = "hello world";
这样是错误的, 因为 s 的类型是 char ** 而 "hello world "的类型是 char *
虽然都是地址, 但是指向的类型不一样,因此,不能这样用。,从其本质来分析,"hello world",代表一个地址,
比如0x003001,这个地址中的内容是 'h' ,为 char 型,而 s 也保存一个地址 ,这个地址中的内容(*s) 是char * ,
是一个指针类型, 所以两者类型是不一样的。 。。*/
}