因为*s[2]实际可以理解为一个二级指针。
建议这么看 char* s[2].
s里的每个元素都是一个指针,指向的位置存储的是c++和Language,
而,s,其数值(你可以打印出来看),是s这个数组的首地址。s+1就是s[1]的地址(注意是地址)。
故p指向的地址里面是s[1]的地址。s[1]里面存的是"Language"的首地址,*s[1]里面是“L”,*(s[1] + 1)里面存的是"a"。
这样你就理解了吧,*p是s[1]的地址,**p就是"L"了。
1)char *s[2] 的含义是,s 一个具有两个元素的数组,数组的每个元素的类型是 char *;
2)s[0] = "c++" 和 s[1] = "Language"两个赋值语句,对数组s的两个元素赋值;
3)char **p 的含义是, p 是一个指针,该指针指向另一个指向字符串的指针(有些拗口,呵呵呵~~~) ,也就是你“二级指针”表述的含义。
4)在赋值语句 p = s + 1 中,重点要理解 s 的含义!按c语言(c++)语法:数组名就是指向数组第一个元素的指针。在程序里 char *s[2],那么数组名s就是指向s[0]的指针,而元素s[0]本身就是一个指向字符的指针,因此s是一个指针,该指针指向另一个字符指针s[0]。这样,表达式 s+1的含义是指向 s[1]的指针了。所以赋值语句 p = s+1执行后p指向了s[1]。
5)基于以上4点,cout<<**p中 **p 的含义是取出s[1]的首字符,即'L'
首先s[0]的值是“c++”这个字符串的首地址,而s是指针数组的别名其值是指向“c++”这个字符串首地址的地址,p=s+1也就将s下移一位指向“Language”的首地址的地址,然后赋值给p,则*p应该是一个地址,**p打印出应该是"L~”的第一个字母。
定义二级指针是应为,你定义的是 char类型,char就是一个字符,这里的q和s是相等的,只是q的长度好没有NEW出,**p是指你的定义的这个数据的内存首地址,所以就是 L
不知道你明白了没?
*代表的是一个地址