(9) Funciones de puntero y punteros de función

Declaración de puntero:

Un puntero es en realidad una variable. El método de declaración de un puntero es similar a una declaración de variable general, como sigue:

int *p;             // 声明一个 int类型的指针,该指针指向一个int类型的对象
char *p;            // 声明一个 char类型的指针,该指针指向一个 char类型的对象
int *arr[10];       // 声明一个指针数组, 该数组有10个元素,其中每个元素都是一个指向int 类型对象的指针
int*arr)[10];    // 声明一个数组指针,该指针指向一个 int 类型的以为数组
int **p;            // 声明一个二级指针p,该指针指向一个 int 类型的指针

Declarar una variable de puntero no asigna memoria automáticamente. Antes del acceso indirecto al puntero, el puntero debe inicializarse: o bien hacer que apunte a la memoria existente o asignarle memoria dinámicamente, de lo contrario no sabemos dónde apunta el puntero Este problema requiere especial atención.

¿Qué es un puntero de función?

Definición de puntero de función : un puntero de función es una variable de puntero que apunta a una función. Por lo tanto, el "puntero de función" en sí mismo debe ser primero una variable de puntero, pero la variable de puntero apunta a una función. Esto es como usar variables de puntero para apuntar a variables enteras, tipos de caracteres y matrices, aquí apunta a funciones.

La expresión general es :Especificador de tipo (* nombre de función) (parámetro)

int (*fun)(int x);        // 函数指针的定义
int (*fun)(int x,int y);  // 函数指针的定义

Asignación de
punteros de función Los punteros de función deben inicializarse antes de ser utilizados después de que se definan como otros punteros.
Los punteros de función tienen dos propósitos: llamar a funciones y crear parámetros de función

int (*fun)(int x,int y);  // 函数指针的定义
fun=&Function;            // 函数指针的赋值方式1
fun=Function;             // 函数指针的赋值方式2
x=(*fun)();               // 函数指针的调用方式1
x=fun();                  // 函数指针的调用方式2,错误的方式

No es necesario tomar el operador de dirección & al asignar una función, porque un identificador de función representa su dirección, y la función no necesita paréntesis al asignar;

Si es una llamada de función, también debe incluir una lista de parámetros entre paréntesis.

El uso de punteros de función Cuando
usamos punteros, necesitamos usar la tecla * para obtener el valor en la memoria, y lo mismo es cierto para los punteros de función. Saque la función almacenada en esta dirección a través de (* pf) y luego llámela.


char* fun(char * p1,char* p2)
{
    
    
int i=0;
i=strcmp(p1,p2);
if(i==0)
{
    
    
return p1;
}
else
{
    
    
return p2;
}
}

int main()
{
    
    
char *(*pf)(char *,char *);
pf=&fun;
(*pf)("a","b");
return 0;
}

¿Qué es una función de puntero?

** Definición de función de puntero: ** El punto de apoyo de una función de puntero es una función, y el valor de retorno de esta función es un puntero, que es similar a la función normal int función (int, int), excepto que los datos devueltos el tipo es diferente.

_type_ *function(int, int);   // 返回的是指针地址
int function(int, int);       // 返回的是int类型的数据
int *fun(int x);              // 指针函数的定义
int * fun(int x, int y);      // 指针函数的定义
int* fun(int x,int y);        // 指针函数的定义

Las tres formas de escritura anteriores son correctas, pero * es más fácil de entender cerca del valor de retorno.

Puntero a la llamada a la función
al llamar a la función puntero, es necesario recibir el mismo tipo de valor de retorno de una función puntero del mismo.

typedef struct _Data{
    
    
int a;
int b;
} Data;

// 指针函数
Data* f(int a,int b)
{
    
    
Data *data=new Data;
data->a=a;
data->b=b;
return data;
}

int main()
{
    
    
Data *myData=f(4,5);
cout<<"f(4,5) = " << myData->a << myData->b;
return 0;
}

Sin embargo, también puede definir su valor de retorno como tipo void * y convertir el valor de retorno al tipo que desee cuando lo llame.

El resultado de salida es el mismo, pero no se recomienda su uso, porque la conversión forzada puede traer riesgos. El tipo de retorno puede ser cualquier tipo básico y compuesto. Las funciones que devuelven punteros son muy versátiles.

De hecho, cada función, incluso si no devuelve un puntero de cierto tipo, tiene una dirección de entrada en sí misma, que es equivalente a un puntero.

Por ejemplo, una función que devuelve un valor entero es en realidad equivalente a devolver el valor de una variable de puntero, pero la variable en este momento es solo la función en sí, y toda la función es equivalente a una "variable".


La diferencia entre un puntero de función y una función de puntero

1. Diferentes definiciones

  • Una función de puntero es esencialmente una función y su valor de retorno es un puntero.

  • El puntero de función es esencialmente un puntero, que apunta a una función.

2. Escritura diferente

  • Función de puntero: int * fun (int x, int y);

  • Puntero de función: int (* fun) (int x, int y);

Puede entenderse de forma simple y aproximada que el * de la función puntero pertenece al tipo de datos, y el asterisco del puntero a la función pertenece al nombre de la función.

Para hacerlo más simple, puede distinguir entre los dos de esta manera: el nombre de la función entre paréntesis es el puntero de la función, de lo contrario es la función del puntero.

3. El uso es diferente. Se
utilizan los punteros de función y las funciones de puntero anteriores, pero el uso de punteros de función será mayor, y la dificultad es relativamente hablando, como punteros de función y funciones de devolución de llamada. Si es un C ++ no estático puntero de función miembro, su uso También hay algunas diferencias: los estudiantes interesados ​​pueden seguir tweets de seguimiento o leer libros relacionados por su cuenta.

Supongo que te gusta

Origin blog.csdn.net/qq_40329851/article/details/114951175
Recomendado
Clasificación