一、char * 和 char [ ]
char a[ ]定义的是一个字符数组,注意强调是数组。
char * 定义的是一个字符串指针,注意强调是指针。
char *s定义了一个char型的指针,它只知道所指向的内存单元,并不知道这个内存单元有多大。
s是一个指针,保存的是一个地址。*s表示的这个地址指向内存的值,ascii码值。
char a[ ]定义的是一个数组;
char *s = (char *)malloc(n);//其中n为要开辟空间的大小
相当于char s[n];
C语言中操作字符串是通过它在内存中的存储单元的首地址进行的,这是字符串的终极本质。
可以s=a; 但是不能a=s; a表示的也是数组的首地址,但是a本质上是一个数组。
还有一个不同是不可以通过下标如s[0]进行赋值,但是数组可以。
二、char **和char *a[ ]
由于[ ] 的优先级高于* 所以a先和 [ ]结合。
他还是一个数组,数组中的元素才是char * ,前面讲到char * 是一个变量,保存的是地址。
也就是说a还是一个数组,只是它里面的元素是地址。
地址不一定是连续的。
char **s为二级指针, s保存一级指针 char *的地址。
用 char **s 时,要给它分配一个内存地址。
char **s ;
s = (char **) malloc(sizeof(char**));
说白了,二级指针保存的是一级指针的地址,
它的类型是指针变量,而一级指针保存的是指向数据所在的内存单元的地址,
char*s中s是一个地址,保存的内容不是地址,是一个字符串,
char**s中s是一个地址,地址中的内容还是一个地址。
三、*和&
int a=1;
int *b = &a;
a是一个值,&a是a存储的地址,而b是一个地址,存放的是a的地址,*b是取b对应地址的数据。
&b表示的存放这个地址的地址。