一个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;
}
麻烦解释一下,谢谢!! 展开
#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;
}
麻烦解释一下,谢谢!! 展开
5个回答
展开全部
因为*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"了。
建议这么看 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”的首地址给进去了,你说打印出来的是不是这个字符串?
展开全部
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'
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~”的第一个字母。
追问
我用visual c++运行了一次,*p的结果是Language,这是为什么呢?
追答
因为*p是L~的首地址啊,String a = “abc” cout<<a;a是“abc”的首地址,打印出abc来,一样的道理啊。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
定义二级指针是应为,你定义的是 char类型,char就是一个字符,这里的q和s是相等的,只是q的长度好没有NEW出,**p是指你的定义的这个数据的内存首地址,所以就是 L
不知道你明白了没?
不知道你明白了没?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
*代表的是一个地址
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询