一个c++问题(关于数组和指针)

在以下程序中,定义指针p时,为什么要定义为二级指针,而不能定义为*p?而且最后的cout<<**p为什么显示首字母L?#include<iostream>usingnam... 在以下程序中,定义指针p时,为什么要定义为二级指针,而不能定义为*p?而且最后的cout<<**p为什么显示首字母L?
#include <iostream>
using namespace std;
int main()
{
char **p,*s[2];
s[0]="c++";
s[1]="Language";
p=s+1;
cout<<*p;
cout<<**p;
return 0;
}
麻烦解释一下,谢谢!!
展开
 我来答
lqn_anthony
2013-09-19 · 超过23用户采纳过TA的回答
知道答主
回答量:67
采纳率:0%
帮助的人:56.7万
展开全部
因为*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"了。
更多追问追答
追问
我用visual c++运行了一次,*p的结果是Language,这是为什么呢?
追答
首先,你这个如果用的是C++的话,你给的是*p对吧。

*p就是s[1]的地址,也就是"Language"的首地址。(之前说的“里面存的”与这里的意思一样)

于是你把一个字符串的地址给进了cout

字符串(数组)的地址,就是代表整个字符串的,你这么给进cout肯定就是Language了。

你回想一下平时把一个字符串给进cout是怎么给的:
char x[] = "hello world"
cout<<x<<"\n";
你这里给进去的x,实际上就是这个字符串的首地址,你用printf %d打印x和打印&x是一样的。

于是,你这里也就把“Language”的首地址给进去了,你说打印出来的是不是这个字符串?
freeeeeewind
2013-09-19 · TA获得超过1万个赞
知道大有可为答主
回答量:3227
采纳率:94%
帮助的人:1299万
展开全部
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'
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
毛毛羽喵喵
2013-09-19 · 超过15用户采纳过TA的回答
知道答主
回答量:56
采纳率:0%
帮助的人:25.9万
展开全部
首先s[0]的值是“c++”这个字符串的首地址,而s是指针数组的别名其值是指向“c++”这个字符串首地址的地址,p=s+1也就将s下移一位指向“Language”的首地址的地址,然后赋值给p,则*p应该是一个地址,**p打印出应该是"L~”的第一个字母。
追问
我用visual c++运行了一次,*p的结果是Language,这是为什么呢?
追答
因为*p是L~的首地址啊,String a = “abc” cout<<a;a是“abc”的首地址,打印出abc来,一样的道理啊。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
爱喝可乐旳小乳猪
2013-09-19
知道答主
回答量:18
采纳率:0%
帮助的人:14万
展开全部
定义二级指针是应为,你定义的是 char类型,char就是一个字符,这里的q和s是相等的,只是q的长度好没有NEW出,**p是指你的定义的这个数据的内存首地址,所以就是 L
不知道你明白了没?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
384604597
2013-09-19 · 超过10用户采纳过TA的回答
知道答主
回答量:158
采纳率:0%
帮助的人:22.5万
展开全部
*代表的是一个地址
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式