首页 > 试题广场 >

以下程序的输出结果是?

[单选题]
以下程序的输出结果是:
#include <iostream>
using namespace std;
void func(char **m){
    ++m;
    cout<<*m<<endl;
}
int main(){
    static char *a[]={"morning", "afternoon", "evening"};
    char **p;
    p=a;
    func(p);
    return 0;
}

  • afternoon
  • 字符o的起始地址
  • 字符o
  • 字符a的起始地址
这是一个关于二维数组指针的问题。
假设定义一个int型的二维数组指针。
int Sec[2][3]={4,6,3,7,2,7};
int **P = Sec; 
**p 等价 Sec[0][0]  *p 等价 Sec[0]  *(p+n) 等价 Sec[n] *(*(p+n)+m) 等价 Sec[n][m]
所以++m,为行数增加为afternoon一行,而*m输出整行。

发表于 2015-09-05 15:51:02 回复(4)
p二级指针,双指针就是二维数组,始终指向每行的首元素,p+1就是二维数组加一行,*p+1指向p所指向行数的下一个元素。本题p指向二维字符数组a,二维数组的每行分别是三个字符串一维字符数组,起初p指向第一行morning, p++指向afternoon所在行,由于打印字符串的首地址等于打印字符串,所以打印完整的afternoon,而不是a的首地址。
发表于 2016-06-21 10:07:33 回复(2)

二级指针的问题,m=p,那么m指向第一个字符串,++m指向第二个字符串。。。

表示Delia同学和josan同学的解析都是有问题的。

并没有这样的用法(Delia同学错误的地方):

char a[3][10] = { "abc", "def", "ghi" };
// char **p = a; // 错了!!

表示高票很迷。。。要用也是

char (*p1)[10] = &a[0]; // 现在p1指向a的第一行
cout << *(p1+1) << endl; // 输出def

好了,现在我非要用二级指针可以吗?可以:

char (**p2)[10] = &p1;
cout << *(*(p2) + 2) << endl; // 输出ghi

下面说一下不对的用法:

char (*p3)[10] = a; // 对的
char **p4 = p3; // 错了
++p4; // 错了

错在p3是char (*)[10]类型,而p4是char **类型,并不可以直接赋值。

个人理解,请多多指教,Thanks。

编辑于 2017-08-09 22:39:39 回复(0)

最高票的答案是错的,大家不要被误导。

int Sec[2][3]={4,6,3,7,2,7};
int **P = Sec;        //Error
int (*p1)[3] = Sec;  //OK 
int **p = Sec;       //OK

数组与指针传递之间,只存在“降一次”关系,不存在降两次关系。

自己总结的术语,可能不是很准确

关于二维数组的参数传递的问题,可以看我的博文
C/C++语言 二维数组作为函数的参数总结

再来看看本题
首先,看一维数组的情况;

int a[10] ={1, 2, 3};
int *pa = a;
++pa;    //大家应该都知道,pa+1就是a+1;++pa之后,*pa就是a[1]

再来看二维数组的情况;

int a[3][10] = {{1}, {2}, {3}};
int (*a1)[10] = a;
int * a2[3] = {a[0], a[1], a[2]};
int ** pb = a1;     //报错,两个都是指针,但是不能类型转换
int ** pa = a2;     //正确,数组转为指针,降一次,可以类型转换
++pa;     //同理,pa+1就是a1+1; ++pa之后,*pa就是a1[1]

所以

cout<<*m<<endl;   //就是cout<<a[1]<<endl;
编辑于 2017-08-09 11:48:49 回复(3)
p二级指针,双指针就是二维数组,始终指向每行的首元素,p+1就是二维数组加一行,*p+1指向p所指向行数的下一个元素。本题p指向二维字符数组a,二维数组的每行分别是三个字符串一维字符数组,起初p指向第一行morning, p++指向afternoon所在行,由于打印字符串的首地址等于打印字符串,所以打印完整的afternoon,而不是a的首地址。
发表于 2021-10-10 08:57:29 回复(0)
看下面的结构图便于理解,如果不太懂,参考这个博客http://blog.csdn.net/g200407331/article/details/52610150
发表于 2017-12-29 17:05:58 回复(0)
个人感觉上面的解析有问题,a就应该理解为一维数组,只不过数组的每个单元为字符串。
所以p指向数组的第一个元素,即p里存储这数组第一个元素的地址。数组里第一个元素是字符串“morning”,所以*p就是“morning”,*(++p)是“afternoon”。
*p的类型是字符串char*,那么**p就是字符串的第一个字母。
如有错误,欢迎留言指正。
发表于 2017-04-19 20:16:14 回复(2)

cout<<(char * p)<<endl; 比较特殊,会打印整个字符串

std::cout 的类型 std::ostream 的基类 std::basic_ostream 有一个这样的 operator<< 重载:
basic_ostream& operator<<( const void* value ); 
这个重载可以输出指针的值(也就是地址)。
----------------------------------------
然而 std::basic_ostream 还有几个非成员 operator<< 重载:
template< class CharT, class Traits > basic_ostream<CharT,Traits>& operator<<( basic_ostream<CharT,Traits>& os, const CharT* s ); template< class CharT, class Traits > basic_ostream<CharT,Traits>& operator<<( basic_ostream<CharT,Traits>& os, const char* s ); template< class Traits > basic_ostream<char,Traits>& operator<<( basic_ostream<char,Traits>& os, const char* s ); template< class Traits > basic_ostream<char,Traits>& operator<<( basic_ostream<char,Traits>& os, const signed char* s ); template< class Traits > basic_ostream<char,Traits>& operator<<( basic_ostream<char,Traits>& os, const unsigned char* s ); 
这些函数负责输出由 char* 或其他字符类型的指针表示的字符串。
----------------------------------------
所以由于 char* (或者 charT*)比 void* 更加特化(不知道特化是什么没关系,以后会学到),在 【cout << p】且 p 的类型是 char* 的情况下,负责输出字符串的 operator<< 重载会被调用。
发表于 2017-08-10 18:14:49 回复(0)
m是指向char *即字符串的指针,在字符串之间移动;*m是指向char即字符的指针,在字符之间移动,那么*m相当于字符串的首地址,打印*m相当于打印字符串,故选A。
编辑于 2018-11-28 15:49:58 回复(0)
m指向的是morning
向后偏移一个元素大小,即为afternoon
发表于 2022-09-10 20:20:41 回复(0)
我试试
发表于 2022-06-13 00:15:57 回复(0)
题目看成是  *(a+1)  比较直观
 a是数组名,表示a的首个元素地址  即a[0]  morning的地址,a+1即a[1]  afternoon的地址

                                 
 
发表于 2021-02-22 16:03:06 回复(0)
char *a[]为指针数组,即里面的元素都是为指针。p为一个二级数组,p=a为二级指针记录下指针数组中第一个数组元素的地址,在函数调用中,二级指针的指向数组中下一个元素指针的地址,然后输出该地址的值。
发表于 2021-01-15 09:57:10 回复(0)
我把代码敲在电脑上,电脑报错。。。说什么 const char *类型不能初始化char*内型的实体。。。。。。这个题目没有问题嘛。。嘤嘤嘤(ಥ_ಥ)
发表于 2020-12-07 13:03:04 回复(0)
这题目有问题编译不过
1.  数组元素是常量,所以需要定义为static const char *a[] = { "morning", "afternoon", "evening" };否则编译不过
2.
 const char**p;
    p=a;//同时修改为const
#include <iostream>
using namespace std;
void func(const char **m) {     ++m;     cout << *m << endl;
}
int main() {     char *aa[3];     char a1[100]= "morning";     aa[1] = a1;     const char *a[] = { "morning", "afternoon", "evening" };     const char**p = a;     func(p);//输出afternoon     func(p);//还是输出afternoon,指针p的指向一直是a,是二维数组的首地址不变     return 0;
}
输出
afternoon
afternoon
编辑于 2020-03-28 22:07:51 回复(0)
这是啥情况
发表于 2018-12-12 09:18:45 回复(1)