zoukankan      html  css  js  c++  java
  • 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]表示的是数组中第一个元素的地址,虽然值一样但含义不一样

  • 相关阅读:
    层次状态机【转】
    工作中常用的英文单词缩写
    一个页面如何放多个百度编辑器 Ueditor 1.4.3?PHP如何获取Ueditor 的值?
    C/C++的开发环境安装
    Ubuntu 14 如何打开 .chm格式文档?
    #ThinkPHP_3.2.2模型# where查询条件汇总
    Ubuntu 14 编译安装 PHP 5.4.45 + Nginx 1.4.7 + MySQL 5.6.26 笔记
    PHP文件夹文件拷贝/复制函数 dir_copy($src = '', $dst = '')
    Ubuntu 14中,Foxmail关联163邮箱账号时,总提示“密码错误”的解决方案
    Ubuntu 14 修改默认打开方式
  • 原文地址:https://www.cnblogs.com/1149825709qq/p/13424829.html
Copyright © 2011-2022 走看看