zoukankan      html  css  js  c++  java
  • C主函数:void main(int argc,char *argv[] )

    这主函数的形参乍一看略抽象啊,什么意思?主函数还有参数了?

    这是用来在命令行里传递参数用的!

    argc 记录命令行参数个数(以间隔为界,不含间隔);*argv[] 是个指针数组,分别指向每个参数。

    例如:在命令行执行 a.exe username password ,则

    argc 等于 3 ,

    argv[0] 为 “a.exe”

    argv[1] 为 “username”

    argv[2] 为 “password”

    又有这样的主函数:void main(int argc,char **argv) 这又是什么鬼?

    其实和上面那个是一样的!这就涉及到数组和指针的关系问题了,他俩真是纠缠不清呢。

    在C语言里,要想定义一个字符串,有两种办法:

    1、定义一个字符数组:char a[] = "hello"

    2、定义一个字符指针:char *b = "hello"

    a 和 b 中存储的都是首字符的地址。我们可以通过 a[2] 得到 “l” ,而且,也可以通过 p[2] 得到 “l”。

    printf(a) 和 printf(b) 是一样的。在打印时,printf()打印指向的这个字符,如果后面仍有字符,就挪动指针继续打印,直到。

    事实上,在通过a[2]取得元素值时,其内部就是通过指针方法得到的。

    而两者的不同之处在于:

    a 是一个常量,存储的是第一个字符的地址,是不可变的。比如 a++就是错的。

    b 是个指针变量,存储第一个字符的地址,也就是字符串的地址,它是可变的,可以b++,还可通过 *(b+2) 得到 “l”。

    插播一条基础知识:

    回到上面 char *argv[] 和 char **argv 的问题,两者为什么是一样的呢?

    char *argv[] 是一个指针数组(从右往左读,[]的优先级高于*,如果是char (*argv)[] 的话就是一个数组指针了),数组的每一项都是一字符指针,如下图:

    char **argv 从右往左读-> (char *)(*argv) ,可以发现argv是一个指针,指向什么呢,指向字符指针!那么这是一个二级指针,字符指针的指针,相当于字符数组的数组。当取argv[1]时,也就得到第二个字符指针了。所以结构其实和上图是一样的。

  • 相关阅读:
    MySQL 之 Metadata Locking 研究
    Spring, MyBatis 多数据源的配置和管理
    ThreadLocal 源码剖析
    Java多线程中的死锁问题
    Java并发基础框架AbstractQueuedSynchronizer初探(ReentrantLock的实现分析)
    PriorityQueue和Queue的一种变体的实现
    被我们忽略的HttpSession线程安全问题
    Java并发之原子变量和原子引用与volatile
    使用Java实现单线程模式
    这些年无处安放的博客
  • 原文地址:https://www.cnblogs.com/babywhale/p/4482733.html
Copyright © 2011-2022 走看看