char *str[] = {"abc", "mike", "hello"};
这是字符指针数组,每一个数组元素是一个指针变量,而每个指针变量指向字符串首字符地址,即是字符串的地址。因为每一个字符串都代表的是一个地址,是字符串首字符的地址。字符串常量是放在文字常量区,是不可以更改的。而指针数组str里面存放的是指向字符串地址,它是可变的。如str[0] 是可变的,它是指针变量,但是*str[0]是不可变的,它在试图改变字符串常量"abc"的首字符中的a。
二级指针与字符指针数组是不同的,类似char **p = {"abc", "mike", "hello"};是错误的。p只是一个二级指针变量,也仅仅是一个指针变量,只能放一个地址。
char *str[] = {"abc", "mike", "hello"};
char **p = str;
这样的写法是正确,str代表的是这个指针数组的首元素地址,是一个指针。str = &str[0],而str[0]本身又是指向字符串"abc"的指针,所以指针的指针当然用二级指针来存放。
二级指针常用的用法是在函数传参过程中。void fun(char *str[])这样的函数,函数中的的形参编译器会当作指针处理,不是数组,所以可以写成void fun(char **str)
void fun(char **p);
void fun(char *p[100])
void fun(char *p[])
这三个是等价的,编译器都是当作char **p处理的