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处理的
二级指针
二级指针存放的是指针变量的地址。
例如:
char s=‘s’;
char* ps=&s;
char** pps=&ps;
pps就是一个二级指针,它里面存放的是一级指针的地址,对它解引用可以得到一级指针的内容,也就是得到s的地址,再对一级指针解引用可以得到s中的内容。
原文链接:https://blog.csdn.net/ytx2014214081/article/details/79275405 作者:迷茫的叶