无法理解函数中c中的指针
Unable to understand pointers in c in a function
我在网站上阅读这段代码。我对编程还很陌生,所以请详细解释一下。
#include <stdio.h>
// A normal function with an int parameter
// and void return type
void fun(int a)
{
printf("Value of a is %d\n", a);
}
int main()
{
// fun_ptr is a pointer to function fun()
void (*fun_ptr)(int) = &fun;
/* The above line is equivalent of following two
void (*fun_ptr)(int);
fun_ptr = &fun;
*/
// Invoking fun() using fun_ptr
(*fun_ptr)(10);
return 0;
}
疑惑-
我无法理解这种类型的声明和赋值 void (*fun_ptr)(int) = &fun;
我的意思是,如果我们声明一个数据类型,那么我们会像 int a;
那样做并将其分配为 a=10;
但这里我们通过写 (*fun_ptr)(10);
来分配它。请帮忙。
让我们用 type-aliases 和一些注释稍微重写一下:
// Define a type-alias names fun_pointer_type
// This type-alias is defined as a pointer (with the asterisk *) to a function,
// the function takes one int argument and returns no value (void)
typedef void (*fun_pointer_type)(int);
// Use the type-alias to define a variable, and initialize the variable
// This defines the variable fun_ptr being the type fun_pointer_type
// I.e. fun_ptr is a pointer to a function
// Initialize it to make it point to the function fun
fun_pointer_type fun_ptr = &fun;
// Now *call* the function using the function pointer
// First dereference the pointer, to get the function it points to
// Then call the function, passing the single argument 10
(*fun_ptr)(10);
希望它能让事情变得一点更清楚发生了什么。
而不是这条记录
(*fun_ptr)(10);
你可以写
fun_ptr(10);
这是函数指针fun_ptr
指向的函数fun
的函数调用,因为函数地址
在其声明中初始化了该指针
void (*fun_ptr)(int) = &fun;
反过来这个声明可以像
这样写得更简单
void (*fun_ptr)(int) = fun;
因为表达式中使用的函数指示符(在本例中 fun
)被隐式转换为指向函数的指针。
您可以通过以下方式为函数类型使用 typedef 别名
typedef void Func( int );
在这种情况下,函数指针的上述声明可能看起来更简单,如
Func *fun_ptr = fun;
这是您的程序,使用函数类型的 typedef 重写 fun
。
#include <stdio.h>
typedef void Func( int );
// Function declaration without its definition using the typedef
// This declaration is redundant and used only to demonstrate
// how a function can be declared using a typedef name
Func fun;
// Function definition. In this case you may not use the typedef name
void fun( int a )
{
printf("Value of a is %d\n", a);
}
int main(void)
{
// Declaration of a pointer to function
Func *fun_ptr = fun;
// Call of a function using a pointer to it
fun_ptr( 10 );
return 0;
}
以下是两条语句的意思
void (*fun_ptr)(int) = &fun;
这称为在同一行中声明和初始化 fun_ptr
,这与执行 int a = 10;
相同
(*fun_ptr)(10);
不是赋值语句,它是通过函数指针fun_ptr
.
调用函数fun
您还可以使用 typedef
创建一个新的用户定义的函数指针,并按照上面的答案使用。
如果您是编程新手,这是一个高级主题,fun_ptr
是一个指向函数的指针。
声明:
void (*fun_ptr)(int) = fun;
意味着fun_ptr
是一个指向函数的指针,它接受一个int
参数并返回void
,如果用一个指向函数fun
的指针初始化。 (你不需要 &
)
行:
(*fun_ptr)(10);
不赋值,它调用fun_ptr
指向的函数,但是很复杂
fun_ptr(10);
由于 fun_ptr
指向 fun
这等同于`fun(10).
使用函数指针有其用途,例如在排序函数中,比较函数作为函数指针传入,因此调用之间的排序可能不同。
达到同样的效果,而且更加美观。
我在网站上阅读这段代码。我对编程还很陌生,所以请详细解释一下。
#include <stdio.h>
// A normal function with an int parameter
// and void return type
void fun(int a)
{
printf("Value of a is %d\n", a);
}
int main()
{
// fun_ptr is a pointer to function fun()
void (*fun_ptr)(int) = &fun;
/* The above line is equivalent of following two
void (*fun_ptr)(int);
fun_ptr = &fun;
*/
// Invoking fun() using fun_ptr
(*fun_ptr)(10);
return 0;
}
疑惑-
我无法理解这种类型的声明和赋值 void (*fun_ptr)(int) = &fun;
我的意思是,如果我们声明一个数据类型,那么我们会像 int a;
那样做并将其分配为 a=10;
但这里我们通过写 (*fun_ptr)(10);
来分配它。请帮忙。
让我们用 type-aliases 和一些注释稍微重写一下:
// Define a type-alias names fun_pointer_type
// This type-alias is defined as a pointer (with the asterisk *) to a function,
// the function takes one int argument and returns no value (void)
typedef void (*fun_pointer_type)(int);
// Use the type-alias to define a variable, and initialize the variable
// This defines the variable fun_ptr being the type fun_pointer_type
// I.e. fun_ptr is a pointer to a function
// Initialize it to make it point to the function fun
fun_pointer_type fun_ptr = &fun;
// Now *call* the function using the function pointer
// First dereference the pointer, to get the function it points to
// Then call the function, passing the single argument 10
(*fun_ptr)(10);
希望它能让事情变得一点更清楚发生了什么。
而不是这条记录
(*fun_ptr)(10);
你可以写
fun_ptr(10);
这是函数指针fun_ptr
指向的函数fun
的函数调用,因为函数地址
void (*fun_ptr)(int) = &fun;
反过来这个声明可以像
这样写得更简单void (*fun_ptr)(int) = fun;
因为表达式中使用的函数指示符(在本例中 fun
)被隐式转换为指向函数的指针。
您可以通过以下方式为函数类型使用 typedef 别名
typedef void Func( int );
在这种情况下,函数指针的上述声明可能看起来更简单,如
Func *fun_ptr = fun;
这是您的程序,使用函数类型的 typedef 重写 fun
。
#include <stdio.h>
typedef void Func( int );
// Function declaration without its definition using the typedef
// This declaration is redundant and used only to demonstrate
// how a function can be declared using a typedef name
Func fun;
// Function definition. In this case you may not use the typedef name
void fun( int a )
{
printf("Value of a is %d\n", a);
}
int main(void)
{
// Declaration of a pointer to function
Func *fun_ptr = fun;
// Call of a function using a pointer to it
fun_ptr( 10 );
return 0;
}
以下是两条语句的意思
void (*fun_ptr)(int) = &fun;
这称为在同一行中声明和初始化 fun_ptr
,这与执行 int a = 10;
(*fun_ptr)(10);
不是赋值语句,它是通过函数指针fun_ptr
.
fun
您还可以使用 typedef
创建一个新的用户定义的函数指针,并按照上面的答案使用。
如果您是编程新手,这是一个高级主题,fun_ptr
是一个指向函数的指针。
声明:
void (*fun_ptr)(int) = fun;
意味着fun_ptr
是一个指向函数的指针,它接受一个int
参数并返回void
,如果用一个指向函数fun
的指针初始化。 (你不需要 &
)
行:
(*fun_ptr)(10);
不赋值,它调用fun_ptr
指向的函数,但是很复杂
fun_ptr(10);
由于 fun_ptr
指向 fun
这等同于`fun(10).
使用函数指针有其用途,例如在排序函数中,比较函数作为函数指针传入,因此调用之间的排序可能不同。 达到同样的效果,而且更加美观。