【问题标题】:Interpreting c pointer parameter解释 c 指针参数
【发布时间】:2013-04-14 19:41:39
【问题描述】:

您好,我正在学习 C 并且正在学习一个教程,我已经阅读了有关指针基础知识的内容。

main(int argc, char *argv[])

我不太明白如何解释char *argv[]

我是把它读成 CharPointer 指向 argv 数组,还是指向由 char 组成的 chararray 的指针?

[更新]

我可能错了,但是我认为我很困惑,因为我熟悉:

Char* argv[] // 指向 char 数组的指针 char argv[]* // 在指针中设置值

但是我从未见过 char *argv[]

【问题讨论】:

  • 试试这个answer。我相信以前有人问过这个问题。
  • 感谢分享!如果您能获得更多技术知识,我有兴趣了解 C 如何接受它的论点。

标签: c pointers syntax


【解决方案1】:

您从内到外阅读 C 声明,请记住主运算符 .->[] 的优先级高于像 * 这样的一元运算符。因此,您可以向左或向右,由内而外,从最深的嵌套开始,并优先选择向左或向右。

char *argv[]; // argv is an array of pointer to char
int (*f)();   // f is a pointer to a function returning int

这是我刚刚制作的一个完整示例,您可以运行:

int main(void);

// g is an array of pointer-to-function with no parameters returning int
int (*g[])(void) = {
  main,
  main
};

// f is an array of pointer-to-array of pointer-to-function returning int
int (*(*f[2])[2])(void) = {
  &g,
  &g,
};


int main(void) {
  return *f[0][0] == main;
}

$ ./a.out
$ echo $?
# => 1

【讨论】:

  • 对于最后一个,我可能错了,但是我正在阅读它,返回 f 这是一个二维指针数组。请指点双关语
【解决方案2】:

由于您定义它的方式,您应该将其视为指向 char 数组的 char 指针,但不要忘记任何类型的指针(char、int、void、float 等)之间没有区别。它们都是地址变量(某种)。

【讨论】:

    【解决方案3】:
    char *argv[]
    

    argv 是变量/参数名称,它不是type,所以CharPointer points to argv array 不是正确的理解方式。可以说一些pointer to int array or double array,因为intdouble 是类型。

    char* argv[] 实际上是char* 的数组(读取指向char 的指针数组),基本上是一个C 字符串数组。

    【讨论】:

    • 我可能错了,但是我想我很困惑,因为我很熟悉: Char* argv[] // 指向 char 数组的指针 Char argv[]* // 在指针中设置值但是我从未见过字符 *argv[]
    • @laycat 我没见过char argv[]*,但是char * argv[]在C++中很常见。你在哪里看到 char argv[]*?
    • 我犯了一个错误我看到了一个像pointerX 45*这样的语句来改变变量中的值类似于char *argv[] ?
    猜你喜欢
    • 1970-01-01
    • 2011-01-16
    • 2013-03-15
    • 1970-01-01
    • 1970-01-01
    • 2014-11-26
    • 2013-08-19
    • 1970-01-01
    相关资源
    最近更新 更多