• 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
     
     
  • 相关阅读:
    top、ps -ef、ps aux的区别及内容详解
    img2pdf 报 img2pdf.AlphaChannelError: Refusing to work on images with alpha channel 的解决方案
    Scrapy命令行调用传入自定义参数
    查询Linux CPU架构
    LeetCode 216. 组合总和 III | Python
    LeetCode 40. 组合总和 II | Python
    LeetCode 39. 组合总和 | Python
    LeetCode 77. 组合 | Python
    LeetCode 347. 前 K 个高频元素 | Python
    LeetCode 107. 二叉树的层次遍历 II | Python
  • 原文地址:https://www.cnblogs.com/little-white/p/4331788.html
Copyright © 2020-2023  润新知