int main (int argc, const char * argv[0])及指针数组与数组指针

本文转载自:https://blog.csdn.net/u010029439/article/details/87866229

int main (int argc, const char * argv[0]) 中参数的含义;指针数组和数组指针

恩,有的编译器初始化时候会产生这样的参数

argc是命令行总的参数个数,argv[]是argc个参数,其中第0个参数是程序的全名

1. 几种C++ 常见的参数种类

  • int main(void);
  • int main();
  • int main(int argc, char **argv);   //等价于int main(int argc, char *argv[]),是否等价呢?是不是前一个可以表示任意长度的任意个数组,后一个只是定长的任意个数的数组?见下面
  • int main(int argc, char *argv[]);
  • int main(int argc, char arg[][]);
  •    argc=3,表示除了程序名外还有2个参数。    argv[0]指向输入的程序路径及名称。    argv[1]指向参数para_1字符串。    argv[2]指向参数para_2字符串。

2. 参数的说明: int argc 表示main函数的参数个数,main函数至少有一个参数,即第一个参数为该main函数所在程序名:即argv[0]的值, argc>=1

   char ** argv 表示main函数所在的程序在运行时输入的参数表,用,或者空格分隔:第一个参数存在 argv[1]中 每个第二维数组单元存一位数,例如 biji 12546 即argv[1][0] = 1, argv[1][2]=2, argv[1][3]=5, argv[1][4]=5, argv[1][6]=6, 而argv[1]=12546

   第二个参数存在argv[2]中,以此类推。

3. 对于argv存入的实际上是 字符数组, 如果要吧输入的整数字符串转换成整形数,可以调用stl函数 atoi(&argv[1][0])   //注意,不能写&argv[1] 编译会报类型不匹配的错误 error: cannot convert `char**' to `const char*' for argument `1' to `int atoi(const char*)'

  &argv[1][0]是取第一个参数的字符数组的首地址。

指针数组和数组指针问题

这两个名字不同当然所代表的意思也就不同。我刚开始看到这就吓到了,主要是中文太博大精深了,整这样的简称太专业了,把人都绕晕了。从英文解释或中文全称看就比较容易理解。

指针数组:array of pointers,即用于存储指针的数组,也就是数组元素都是指针

数组指针:a pointer to an array,即指向数组的指针

还要注意的是他们用法的区别,下面举例说明。

int* a[4]     指针数组      

                 表示:数组a中的元素都为int型指针     (假如没有*,那么就是数组a中全为int 类型的数据)

                 元素表示:*a[i]   *(a[i])是一样的,因为[]优先级高于*

int (*a)[4]   数组指针      

                 表示:指向数组a的指针 (假如是int (*a),那么就是指向整型a的指针)

                 元素表示:(*a)[i]   

注意:在实际应用中,对于指针数组,我们经常这样使用:

typedef int* pInt;

pInt a[4];

这跟上面指针数组定义所表达的意思是一样的,只不过采取了类型变换。

代码演示如下:

#include <iostream>

using namespace std;

int main()

{

int c[4]={1,2,3,4};

int *a[4]; //指针数组

int (*b)[4]; //数组指针

b=&c;

//将数组c中元素赋给数组a

for(int i=0;i<4;i++)

{

a[i]=&c[i];

}

//输出看下结果

//这里可以理解成,指针数组,首先它是一个数组,我们要先用中括号取出它的元素,然后再用指针还取元素

cout<<*a[1]<<endl; //输出2就对

//这里可以理解成,它就是一个指针,我们要先加上*来拿到它指向的元素,然后再用中括号来取元素中的具体某一个元素

cout<<(*b)[2]<<endl; //输出3就对

return 0;

}

注意:定义了数组指针,该指针指向这个数组的首地址,必须给指针指定一个地址,容易犯的错得就是,不给b地址,直接用(*b)[i]=c[i]给数组b中元素赋值,这时数组指针不知道指向哪里,调试时可能没错,但运行时肯定出现问题,使用指针时要注意这个问题。但为什么a就不用给他地址呢,a的元素是指针,实际上for循环内已经给数组a中元素指定地址了。但若在for循环内写*a[i]=c[i],这同样会出问题。总之一句话,定义了指针一定要知道指针指向哪里,不然要悲剧。

类似的还有指针函数和函数指针,遇到了再说吧。

 思考:

有人这样回复的:

提醒楼主一点,虽然 c和&c的值是一样的,但&c表示的是整个数组的首地址,c表示c[0]的首地址。 ..

然后我们看验证结果:

 我觉得 *(&c) 相当于c

个人理解:&c表示的整个数组的首地址,c[0]表示的是数组中第一个元素的地址,虽然值一样但含义不一样

posted @ 2020-08-03 10:18  夜下青灯  阅读(360)  评论(0编辑  收藏  举报