关于双指针遍历

今晚跟一个朋友突然问我,你懂双指针遍历吗?并叫我敲出代码。当时自己愣住了,但是还是写出来了,第一个版本是:

#include <iostream>
using namespace std;

int main(int argc, char** argv, char** arge)
{
cout<<"输出参数个数:"<<argc<<endl;

cout<<"输出字符串数组:"<<endl;
for(int i=0; i<argc; i++)
cout<<argv[i]<<endl;

cout<<"输出环境变量:"<<endl;
for(int j=0; *arge[j]!='';j++)
{
cout<<arge[j]<<endl;
}

return 0;
}

可能有些人看到int main(int argc, char** argv, char** arge)感觉奇怪,怎么会有三个参数那?当时我朋友跟我说时我同样是感觉很奇怪,百度下没有百度出来,就上msdn的帮助文档看来下,的确有这样的写法。其中:

int argc:表示你在命令行输入命令时,一共有多少个参数;

char** argv:是表示输入参数的字符串数组;

char** arge:是表示系统环境变量。 

上面的代码虽然可以完成遍历,但是是用二维数组的形式遍历,没有达到我朋友说的要求,而且效率低下。我朋友说作为一个优秀的C/C++软件工程师,应该用高效率的指针遍历,想了想,经过改动,就有了第二个版本,代码如下:

#include <iostream>
using namespace std;


int main(int argc, char** argv, char** arge)

cout<<"输出参数个数:"<<argc<<endl;

cout<<"输出字符串数组:"<<endl;
while(*argv)
{
cout<<*argv<<endl;
argv++;
}


cout<<"输出环境变量:"<<endl;
//对于双指针遍历,有必要解释下,arge++加的是四个指针。举个简单的例子:
//Int* a; int ** b; a++是加的一个指针,b++加的是四个指针(当然,这是相对的,不是绝对的)。
while(*arge)
{
cout<<*arge<<endl;
arge++;
}

return 0;
}


以上的版本二就是二维指针的遍历,但仅仅代表个人见解,如有什么不对的地方,还望各位多多指点。



//昨晚的理解似乎有点问题,现在重新说下自己的理解。

#include <iostream>
using namespace std;


int main(int argc, char** argv, char** arge)

cout<<"输出参数个数:"<<argc<<endl;

cout<<"输出字符串数组:"<<endl;
while(*argv) //*argv也是个指针,个人感觉是个一级指针,即一级指针(char*这个字符串)不为空
{
cout<<*argv<<endl;//输出char*
argv++; //加的是二级指针
}


cout<<"输出环境变量:"<<endl;
//对于双指针遍历,有必要解释下,arge++加的是二级指针。举个简单的例子:
//Int* a; int ** b; a++是加的一个一级指针,b++加的是一个二级指针。
while(*arge)
{
cout<<*arge<<endl;
arge++;
}

return 0;
}


Do one thing at a time,and do well.
原文地址:https://www.cnblogs.com/huiz/p/9610692.html