【问题标题】:int main(int carg, const char **varg) { [duplicate]int main(int carg, const char **varg) { [重复]
【发布时间】:2016-11-26 15:40:19
【问题描述】:

我有以下功能:

 int func(int carg, const char **varg) { 
  //code ...
 }

我的理解如下:

varg 是指向第二个指针的指针。第二个指针指向一个字符。这个字符是...

either: a single char (1st case)
or: a char that constitutes the first char of a char array. (2nd case)

这种理解正确吗?

我不明白的是为什么您要将指针作为参数传递给指针。

如果您想(通过引用)将单个字符传递给函数,您可以简单地编写:

int func(int carg, const char *v) { 
      //code ...
}

在第二种情况下,您想(通过引用)将 char 数组传递给函数,可以使用相同的函数(这一次,v 指向传递给函数的数组的第一个元素):

int func(int carg, const char *v) { 
  //code ...
 }

总之,我不明白您为什么要使用指向指针的指针作为函数的参数。

我的具体情况是下面的 main 函数声明:

 int main(int carg, const char **varg);

**varg 处理命令行上的参数。 可以使用 varg[1]、varg[2] 等访问命令行参数。 因此,很明显,**varg 所做的只是将命令行参数保存在一个数组中。但这可以通过以下代码以更简单的方式实现:

 int main(int carg, const char *varg); 

我错过了什么?

【问题讨论】:

  • 抱歉,您需要成为 3 星程序员才能理解这些内容。你需要升级。
  • 为什么你的问题标题是 C 代码的 sn-p?
  • @bolov 我应该读哪些书来理解这些东西? (并成为三星级程序员)?
  • C 是严格按值传递的!你不能在 C 中通过引用传递。指针是一流的类型。 Q你的问题将在任何好的 C 书籍中得到回答,并且已经在这里多次回答。我们不是辅导网站。
  • 你是对的。这可以用一个指针来完成。这只是让 C 做这件事的人的选择。这个问题类似于问“当他们只能使用单个数组时,为什么会有人使用多维数组?”。 (我不是说数组和指针是一回事,这只是一个类比)

标签: c arrays pointers parameter-passing


【解决方案1】:

要存储一个字符串,你需要一个字符数组在内存中。指向 C 中任何数组的指针是 [type of array elements] *,它本质上是指向该数组中第一个元素的指针。如果是字符串,则为char *

命令行参数是字符串的数组。这意味着,您有一个数组,其中每个元素都是内存中的单元格,包含指向另一个数组的指针 - char 数组。在这种情况下,指向数组的指针数组中元素的类型char *,这为我们提供了指向该数组的正确类型的指针(只需将char *替换为公式以上):char **.

【讨论】:

  • 实际上指向数组的指针(char)是char (*)[]char * 是指向 char 的指针。 OP 的困惑是什么。
  • 这是一回事。 char[] 与 char * 相同。它是语法糖
  • @Olaf 请记住,任何blabla[x] 都只是*(blabla + x),仅此而已
  • "char[] is the same as char *" - 绝对不是!试试sizeof(char [37]) == sizeof(char *)!不要传播这种废话!这与具体的实现无关,而是语言。
  • 这不是我试图按他自己的词汇量。有一个正确的术语,叫做type。这就是这里的症结所在。您依赖并争论语言问题的实现细节。更糟糕的是:没有任何必要!即使对于函数参数,您的陈述也不正确。请记住,这是由倾向于按字面意思理解这些陈述的初学者阅读的,因此正确是至关重要。 OP 和许多其他初学者对数组和指针已经有足够多的误解。你不好传播它!
猜你喜欢
  • 1970-01-01
  • 2011-07-08
  • 2011-06-18
  • 2014-10-09
  • 2014-05-09
  • 2020-11-03
  • 2011-04-23
  • 2018-12-01
相关资源
最近更新 更多