【问题标题】:C/C++ pointers as/in functionsC/C++ 指针作为/在函数中
【发布时间】:2015-05-19 05:38:20
【问题描述】:

这是一个非常新手的问题,但我注意到一些 C 函数的形式是:

int* foo(int *N){...}

有人可以吗:

a) 解释一下 int* foo 是什么意思?在这样一种功能中,没有 return 声明。

b) 解释 int *N 有多灵活?即,我知道这意味着该参数是一个指向 int 的指针,但根据我从一个这样的函数的理解来看,这意味着函数 foo 实际上可以采用向量参数。这对我来说毫无意义。

【问题讨论】:

  • 我开始回答,但我认为 a) 你真的应该学习 C 和/或 C++ 的基础知识。至于 b),这是 C 和 C++ 的危险区域之一:指针可以表示很多不同的东西。您通常可以在 C++ 中使用更好的抽象来避免这种情况(主要是标准库中的用户定义类型。)
  • 我学过一些 C 语言,但是看一个特定的程序会引发一些问题。特别是我从没想过“int * N”可能意味着 N* 可能是一个向量参数。这是重点。第一个问题可能是因为给了我错误的代码,但类似的代码中没有返回语句。
  • 我有 Kernighan 和 Ritchie 合着的“The C Programming Language”一书。它似乎没有涵盖这种情况。
  • 查看第 5 章。所有内容都是关于指针和数组的。
  • 好的,所以您知道int* foo(); 是一个返回指向int 的指针的函数,但您想知道它的真正含义吗?

标签: c++ c function pointers


【解决方案1】:

a) 解释int* foo 是什么意思?在一个这样的函数中没有return 语句。

这意味着foo 是一个返回指向int 的指针的函数。如果这样的函数没有return 语句,那么调用该函数将导致未定义的行为。

来自 C++ 标准:

6.6.3 return 声明

...

从函数的末尾流出相当于没有值的返回;这会在返回值的函数中导致未定义的行为。

b) 解释int *N 的灵活性如何?

这取决于foo 的实现。以下是调用foo 的语法有效方法。它们在语义上是否有效取决于foo

int a;
int b[10];
int* c = new int;
int* d = new int[20];

foo(&a);
foo(b);
foo(c);
foo(d);
foo(nullptr);

【讨论】:

  • 感谢您的回答,但该网站正在向我施加压力,要求我删除它。
  • 这取决于你。不用担心。
  • @Lepidopterist:这只是某些“专家”不记得他们的知识来自哪里的愚蠢行为。他们看到一个“简单的问题”并点击“downvote”,有时甚至根本没有阅读。你的问题和你接受的答案应该在任何关于 C 或 C++ 的严肃出版物的首页上。不要关注愚蠢的人。路过就走!
【解决方案2】:

在这个例子中,foo 是一个指向函数的指针,它有一个参数,一个整数指针,它返回 int。就好像你在声明一个名为“*foo”的函数,它接受一个整数指针并返回一个整数;现在,如果 *foo 是一个函数,那么 foo 必须是一个指向函数的指针。

为函数指针编写声明的关键在于,您只是在写出函数的声明,但在通常只放置 func_name 的地方使用 (*func_name)。

【讨论】:

    【解决方案3】:

    int* foo(int *N) 是一个接受指针的函数,这个指针至少指向一个 int,但也可能指向一个整数数组,C 在这个判断上有点草率。

    {
       int n = 0;
       foo(&n);
    }
    

    或许

    {
       int a[17];
       foo(a);
    }
    

    【讨论】:

    • 感谢您回答我的困惑。我认为另一个问题可能是由于代码错误。我很难解释代码,因为它是别人的私有代码,而我的问题是我试图让它发挥作用。
    猜你喜欢
    • 2017-11-28
    • 1970-01-01
    • 1970-01-01
    • 2013-09-12
    • 1970-01-01
    • 1970-01-01
    • 2021-10-05
    • 1970-01-01
    相关资源
    最近更新 更多