相关疑难解决方法(0)

什么是右值,左值,x值,glvalues和prvalues?

在C++ 03中,表达式是rvaluelvalue.

在C++ 11中,表达式可以是:

  1. 右值
  2. 左值
  3. x值
  4. glvalue
  5. prvalue

两类已成为五大类.

  • 这些新的表达类别是什么?
  • 这些新类别如何与现有的左值和左值类别相关联?
  • C++ 0x中的右值和左值类别是否与它们在C++ 03中的相同?
  • 为什么需要这些新类别?是WG21神只是想迷惑我们凡人?

c++ expression c++-faq c++11

1291
推荐指数
13
解决办法
17万
查看次数

函数指针和函数的地址

所以我想在制作函数指针时,你不需要operator &获取初始函数的地址:

#include <stdio.h>

double foo (double x){
    return x*x;
}

int main () {

    double (*fun1)(double) = &foo;
    double (*fun2)(double) =  foo;

    printf("%f\n",fun1(10));
    printf("%f\n",fun2(10));

    printf("fun1 = %p \t &foo = %p\n",fun1, &foo);
    printf("fun2 = %p \t  foo = %p\n",fun2,  foo);       

    int a[10];

    printf("  a = %p \n &a = %p  \n",a,&a);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

>./a.out 
100.000000
100.000000
fun1 = 0x4004f4      &foo = 0x4004f4
fun2 = 0x4004f4       foo = 0x4004f4
  a = 0x7fff26804470 
 &a = 0x7fff26804470 
Run Code Online (Sandbox Code Playgroud)

然后我意识到这对于数组也是如此,这意味着如果你有 …

c pointers function-pointers function

47
推荐指数
2
解决办法
6万
查看次数

函数指针需要一个&符号

在C/C++中,如果我有以下功能:

void foo();
void bar(void (*funcPtr)());
Run Code Online (Sandbox Code Playgroud)

这两个电话之间有区别吗:

bar(foo);
bar(&foo);
Run Code Online (Sandbox Code Playgroud)

c c++ function-pointers

38
推荐指数
2
解决办法
5071
查看次数

调用函数指针时,星号是否可选?

我无法在任何地方找到答案.我刚读了K&R,看到他们调用这样的函数指针:

(*ptr)(arg1, arg2);
Run Code Online (Sandbox Code Playgroud)

然而,我清楚地记得看到有人像这样使用它们:

ptr(arg1, arg2);
Run Code Online (Sandbox Code Playgroud)

但这可能是在C++中.

  • 规则怎么样?
  • 它们在C和C++上有区别吗?

c c++ function-pointers language-lawyer

20
推荐指数
1
解决办法
1232
查看次数

何时数组名称或函数名称"转换"为指针?(在C中)

1) 误解:

  • 每当用C语言声明数组时,都会隐式创建指向数组第一个元素的指针(数组的名称).(是吗?我不这么认为!)

  • 这个页面的前两行(虽然我不确定信息的正确性)说明相同.

    正如我们所看到的,当我们声明一个数组时,为数组的单元分配了一个连续的内存块,并且还分配了一个指针单元(适当类型)并初始化为指向数组的第一个单元.

  • 但是,当我输出包含的地址该指针和地址该指针,就变成是相同的.所以,我认为毕竟不会创建指针.

2)我从这个问题中选了这个.

  • 在大多数情况下,数组名称将转换为指针.

任何人都可以详细解释编译器何时决定数组名称转换为指针,为什么

PS:请解释一下功能.此外,在这个环节中,已经给出,说是一个函数int square(int,int),任意 square,&square,*square,**square是指同一个函数指针.你可以解释吗?

编辑:代码段

int fruits[10];
printf("Address IN constant pointer is %p\n",  fruits);
printf("Address OF constant pointer is %p\n", &fruits); 
Run Code Online (Sandbox Code Playgroud)

输出:

Address IN constant pointer is 0xbff99ca8
Address OF constant pointer is 0xbff99ca8
Run Code Online (Sandbox Code Playgroud)

c arrays pointers function-pointers function

17
推荐指数
1
解决办法
2745
查看次数

为什么使用函数名作为函数指针等效于将address-of运算符应用于函数名?

有趣的是,将函数名称用作函数指针等同于将address-of运算符应用于函数名称!

这是一个例子.

typedef bool (*FunType)(int);
bool f(int);
int main() {
  FunType a = f;
  FunType b = &a; // Sure, here's an error.
  FunType c = &f; // This is not an error, though. 
                  // It's equivalent to the statement without "&".
                  // So we have c equals a.
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

使用这个名称是我们在数组中已经知道的.但是你不能写出类似的东西

int a[2];
int * b = &a; // Error!
Run Code Online (Sandbox Code Playgroud)

这似乎与该语言的其他部分不一致.这个设计的基本原理是什么?

这个问题解释了这种行为的语义及其工作原理.但是我对这种语言设计的原因很感兴趣.

更有趣的是,当用作参数时,函数类型可以隐式转换为指向自身的指针,但在用作返回类型时不会转换为指向自身的指针!

例:

typedef bool FunctionType(int);
void g(FunctionType); // Implicitly converted to void g(FunctionType …
Run Code Online (Sandbox Code Playgroud)

c++ syntax function-pointers

16
推荐指数
2
解决办法
6040
查看次数

通过值(?)而不是函数指针传递函数?

对不起,如果之前已经询问过,但我找不到它.

因此,我试图教自己关于模板和新的C++ 11功能(主要是lambdas,我一直喜欢的其他语言).

但是在我的测试中,我找到了一些我不知道它有效的东西,我试图理解它是如何工作的,但是无法弄清楚它.

以下代码:

template <class Func>
void Test( Func callback ) {
    callback( 3 );
}

void Callback( int i ) {
    std::cout << i << std::endl;
}

int main( int argc, char** argv ) {
    Test( &Callback ); // this I was expecting to work, compiler will see its a pointer to a function
    Test( Callback ); // this also works, but how?!
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

如果我理解模板是如何工作的,基本上它们是编译器知道要构建什么的方案,所以第一次调用Test( &Callback );我期望工作,因为编译器将看到模板接收函数地址并假设参数应该是指针.

但是第二个电话是什么?假设是什么模板?一个函数的副本(如果它甚至有意义)?

c++ templates function c++11

10
推荐指数
1
解决办法
1774
查看次数

什么时候有必要或有意义为函数 f 编写 &amp;f 或为函数指针 fp 编写 *fp (除了:sizeof &amp;f)?

来自 C17 标准草案(6.3.2.1 \xc2\xb64;脚注已删除):

\n
\n

函数指示符是具有函数类型的表达式。除非它是运算sizeof符或一元&运算符的操作数,否则类型为“函数返回类型”的函数指示符将转换为类型为“指向函数返回类型的指针”的表达式。

\n
\n
    \n
  • 根据我从上面引用中省略的脚注,sizeof f(对于函数指示符f)是不符合标准的。
  • \n
  • 请注意,C11 标准还提到了_Alignof运算符。
  • \n
  • 请注意,C2x 草案还提到了typeof操作员。
  • \n
\n

结果(这里:f是函数指示符;fp是函数指针):

\n
    \n
  1. 可以将函数地址指示为&f(显式)或f(短)。
  2. \n
  3. 可以将函数调用如下:\n
      \n
    • (&f)(args)或者f(args)
    • \n
    • fp(args)或者(*fp)(args)
    • \n
    \n
  4. \n
\n

这里,

\n
    \n
  • 左手(&f)(args)/fp(args)与技术上操作函数指针的函数调用一致,并且
  • \n
  • 右边的f(args)/(*fp)(args)与函数调用对函数(而不是指向函数的指针)进行操作的天真的假设是一致的。
  • \n
\n …

c function-pointers language-lawyer

9
推荐指数
1
解决办法
200
查看次数

C函数名称或函数指针?

我们来看看这段代码:

#include <stdio.h>

typedef int (*callback) (void *arg);
callback world = NULL;

int f(void *_) {
    printf("World!");
    return 0;
}

int main() {
    printf("Hello, ");
    // world = f;
    world = &f; // both works
    if (world != NULL) {
        world(NULL);
    }
}
Run Code Online (Sandbox Code Playgroud)

当设置world变量,都 world = f;world = &f;作品.

我应该使用哪个?它取决于编译器还是C版本?

% gcc -v
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 8.0.0 (clang-800.0.38)
Target: x86_64-apple-darwin15.6.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
Run Code Online (Sandbox Code Playgroud)

c function-pointers

6
推荐指数
1
解决办法
2014
查看次数

这两个表达有什么区别

#include <bits/stdc++.h>
using namespace std;
void test(){
    int a = 100;
    cout << a << endl;
}
int main()
{
    void(*b)() = test;
    (*b)();         //expression one
    b();            //expression two
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

test是一个函数指针,不是吗?(*b)()是正确的形式,因为它相当于函数原型。但为什么删除一个符号是正确的呢*?他们都产生了正确的结果。

c++

6
推荐指数
1
解决办法
210
查看次数