c语言char有什么作用,我应该在C语言中使用char ** argv还是char * argv []吗?

79a55a9c7f8210640eb816fad7080fcb.png

有只小跳蛙

当您刚刚学习C时,我建议您首先真正地尝试理解数组和指针之间的差异,而不是普通的事物。在参数和数组方面,有一些令人困惑的规则应在继续操作之前弄清楚。首先,您在参数列表中声明的内容是特殊的。在某些情况下,将事情作为C中的函数参数没有意义。用作参数数组作为参数数组作为参数第二个也许还不清楚。但是当您考虑到数组维的大小是C语言中的类型的一部分时(而未给出维大小的数组具有不完整的类型),这一点就变得很清楚。因此,如果您要创建一个函数,该函数需要一个按值作为数组的值(接收副本),那么它只能对一个大小执行此操作!另外,数组可能会变大,并且C会尝试尽可能快。由于这些原因,在C中,不存在数组值。如果要获取数组的值,则获取的是指向该数组第一个元素的指针。解决方案实际上已经在这里。C编译器不会预先绘制无效的数组参数,而是将各个参数的类型转换为指针。记住这一点,这非常重要。该参数不是数组,而是一个指向相应元素类型的指针。现在,如果您尝试传递数组,则传递的是指向数组第一个元素的指针。游览:用作参数为了完整起见,并且因为我认为这将帮助您更好地理解问题,所以让我们看看尝试将函数用作参数时的事务状态。确实,首先这没有任何意义。参数如何成为函数?嗯,我们当然想要那个地方的变量!那么究竟是什么发生这种情况时,编译器,再次以转换函数为函数指针。尝试传递一个函数将改为传递一个指向该函数的指针。因此,以下内容相同(类似于数组示例):void f(void g(void));void f(void (*g)(void));请注意,*g需要用括号括起来。否则,它将指定一个returning函数void*,而不是一个指向returning函数的指针void。返回数组现在,我在开始时说过数组可以具有不完整的类型-如果您还不提供大小,则会发生这种情况。由于我们已经发现数组参数不存在,而是任何数组参数都是指针,因此数组的大小无关紧要。这意味着,编译器将翻译以下所有内容,并且都是同一件事:int main(int c, char **argv);int main(int c, char *argv[]);int main(int c, char *argv[1]);int main(int c, char *argv[42]);当然,可以在其中放置任何大小并没有多大意义,而只是被丢弃了。因此,C99为这些数字提出了新的含义,并允许在括号之间显示其他内容:// says: argv is a non-null pointer pointing to at least 5 char*'s// allows CPU to pre-load some memory. int main(int c, char *argv[static 5]);// says: argv is a constant pointer pointing to a char*int main(int c, char *argv[const]);// says the same as the previous oneint main(int c, char ** const argv);最后两行说您将无法在函数中更改“ argv”-它已成为const指针。尽管只有少数C编译器支持这些C99功能。但是这些功能清楚地表明“数组”实际上不是一个。这是一个指针。一句警告请注意,仅当您将数组作为函数的参数时,以上所述才是正确的。如果您使用本地数组,则数组将不是指针。这将表现为指针,因为当读出其值如前面所述阵列将被转换为一个指针。但这不应与指针混淆。以下是一个经典的示例:char c[10]; char **c = &c; // does not work.typedef char array[10];array *pc = &c; // *does* work.// same without typedef. Parens needed, because [...] has // higher precedence than '*'. Analogous to the function example above.char (*array)[10] = &c;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值