以下程序的输出结果是:
#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; }
二级指针的问题,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。
最高票的答案是错的,大家不要被误导。
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;
basic_ostream& operator<<( const void* value );
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 );
#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; }