Red de conocimiento informático - Computadora portátil - Uso de punteros de función en lenguaje C

Uso de punteros de función en lenguaje C

La función tiene una ubicación física en la memoria, y esta ubicación se puede asignar a un puntero. La dirección de una función de punto cero es el punto de entrada de la función. Por lo tanto, los punteros de función se pueden utilizar para llamar a una función. La dirección de una función se obtiene utilizando el nombre de la función sin paréntesis ni parámetros. (Esto es muy similar al método para obtener la dirección de la matriz, es decir, la dirección de la matriz se obtiene cuando solo está el nombre de la matriz pero no hay un subíndice).

¿Cómo describir una variable de puntero de función?

Para indicar que el tipo de una variable fn_pointer es "un puntero de función con un valor de retorno de int", puede utilizar la siguiente declaración de descripción:

int (*fn_pointer) ();

Para permitir que el compilador interprete esta declaración correctamente, *fn_pointer debe estar entre paréntesis. Si falta este par de corchetes, entonces:

int *fn_pointer ();

El significado es completamente diferente. fn_pointer será un nombre de función cuyo valor de retorno es un puntero de tipo int.

2: Variable de puntero de función

En lenguaje C, se estipula que una función siempre ocupa un área de memoria continua y el nombre de la función es la primera dirección del área de memoria ocupada por la función. Podemos asignar la primera dirección (o dirección de entrada) de la función a una variable de puntero para que la variable de puntero apunte a la función. Luego, esta función se puede encontrar y llamar a través de la variable de puntero. A esta variable puntero que apunta a una función la llamamos "variable puntero de función".

La forma general de definición de variable de puntero de función es:

Especificador de tipo (* nombre de variable de puntero) ();

Donde "especificador de tipo" significa Referencia al tipo de valor de retorno de la función. "(* nombre de variable de puntero)" significa que la variable que sigue a "*" es una variable de puntero definida. Los corchetes vacíos al final indican que la variable de puntero se refiere a una función.

Por ejemplo: int (*pf) ();

Indica que pf es una variable de puntero que apunta a la entrada de la función y el valor de retorno (valor de la función) de la función es. un número entero.

A continuación se utilizan ejemplos para ilustrar cómo implementar llamadas a funciones en forma de punteros.

int max(int a,int b)

{

si(a>b)devuelve a;

si no, devuelve b ;

}

main()

{

int max(int ​​​​a,int b);

int(*pmax)();

int x,y,z;

pmax=max;

printf("ingrese dos números: /n ");

scanf ("%d%d",&x,&y);

z=(*pmax)(x,y);

printf("maxmum=%d",z);

}

Como se puede ver en el programa anterior, los pasos para llamar a una función en forma de función La variable de puntero es la siguiente:

1>. Defina primero la variable de puntero de función, como int (*pmax) () en la línea 9 del último programa, defina pmax como la variable de puntero de función.

2>Asigne la dirección de entrada (nombre de función) de la función llamada a la variable de puntero de función, como pmax=max en la línea 11 del programa;

3>. Utilice el puntero de función Llame a una función en forma de variable, como z=(*pmax)(x,y) en la línea 14 del programa. La forma general de llamar a una función es: (* nombre de variable de puntero) (lista de parámetros reales) Cuando utilice variables de puntero de función, también debe prestar atención a los dos puntos siguientes:

a. Las variables de puntero de función no pueden realizar operaciones aritméticas, lo cual es diferente de las variables de puntero de matriz. Agregar o restar un número entero a una variable de puntero de matriz puede mover el puntero para que apunte al elemento frontal o posterior de la matriz, mientras que el movimiento del puntero de función no tiene sentido.

b. Los corchetes a ambos lados de "(* nombre de variable de puntero)" en las llamadas a funciones son esenciales. El * no debe entenderse como una operación de evaluación, aquí es solo un símbolo.

3: Función de puntero

Como presentamos anteriormente, el llamado tipo de función se refiere al tipo de valor de retorno de la función. En lenguaje C, se permite que el valor de retorno de una función sea un puntero (es decir, una dirección). Esta función que devuelve un valor de puntero se denomina función de puntero.

La forma general de definir una función de puntero es:

Especificador de tipo * nombre de la función (lista de parámetros formales)

{

… … /* Cuerpo de la función*/

}

El signo "*" antes del nombre de la función indica que es una función de puntero, es decir, el valor de retorno es un puntero. El especificador de tipo indica el tipo de datos al que apunta el valor del puntero devuelto.

Por ejemplo:

int *ap(int x, int y)

{

…… /* Cuerpo de función*/

}

significa que ap es una función de puntero que devuelve un valor de puntero, y el puntero que devuelve apunta a una variable entera. El siguiente ejemplo define una función de puntero nombre_día cuyo valor de retorno apunta a una cadena. En esta función se define un nombre de matriz de puntero estático. A la matriz de nombres se le asignan inicialmente ocho cadenas, que representan los nombres de cada semana y los mensajes de error, respectivamente. El parámetro formal n representa el número entero correspondiente al nombre del día de la semana. En la función principal, tome el número entero de entrada i como parámetro real, llame a la función day_name en la instrucción printf y pase el valor i al parámetro formal n. La declaración de retorno en la función day_name contiene una expresión condicional. Si el valor n es mayor que 7 o menor que 1, el puntero nombre[0] se devolverá a la función principal para generar la cadena de mensaje de error "Día ilegal". De lo contrario, devuelva el nombre de la semana correspondiente generado por la función principal. La línea 7 de la función principal es una declaración condicional. Su semántica es que si la entrada es un número negativo (i <0), el programa finalizará y saldrá. exit es una función de biblioteca. exit(1) significa salir del programa después de que ocurre un error, y exit(0) significa salir normalmente.

Se debe prestar especial atención a la diferencia en la escritura y el significado entre las variables de puntero de función y las funciones de puntero. Por ejemplo, int(*p)() e int *p() son dos cantidades completamente diferentes. int (*p) () es una descripción de variable, lo que indica que p es una variable de puntero que apunta a la entrada de la función. El valor de retorno de la función es un número entero. No debe haber menos corchetes en ambos lados de (*p).

int *p() no es una descripción de variable sino una descripción de función, lo que indica que p es una función de puntero y su valor de retorno es un puntero a un número entero. No hay paréntesis alrededor de *p. Como descripción de una función, es mejor escribir los parámetros formales entre paréntesis para que sea más fácil distinguirlos de las descripciones de variables. Para las definiciones de funciones de puntero, int *p() es solo la parte del encabezado de la función y, en general, debe haber una parte del cuerpo de la función.

main()

{

int i;

char *day_name(int n);

printf ("entrada Día No:/n");

scanf ("%d",&i

if (i<0) salida (1); >

printf("Día No:%2d-->%s/n",i,day_name(i));

}

char *day_n

ame(int n)

{

static char *name[]={ "Día ilegal",

"Lunes", p>

"Martes",

"Miércoles",

"Jueves",

"Viernes",

" Sábado",

"Domingo"};

return ((n<1||n>7) ? nombre[0] : nombre[n]);

}

Este programa utiliza una función de puntero para ingresar un número entero entre 1 y 7 y generar el nombre de la semana correspondiente. La descripción de matrices de punteros y el uso de una matriz cuyos valores de elementos son punteros es una matriz de punteros. Una matriz de punteros es una colección ordenada de punteros. Todos los elementos de una matriz de punteros deben ser variables de puntero con el mismo tipo de almacenamiento y que apunten al mismo tipo de datos.

La forma general de descripción de la matriz de punteros es: especificador de tipo * nombre de la matriz [longitud de la matriz]

El especificador de tipo es el tipo de la variable a la que apunta el valor del puntero. Por ejemplo: int *pa[3] significa que pa es una matriz de puntero, que tiene tres elementos de matriz, y el valor de cada elemento es un puntero que apunta a una variable entera. Por lo general, se puede utilizar una matriz de punteros para señalar una matriz bidimensional. A cada elemento de la matriz de punteros se le asigna la primera dirección de cada fila de la matriz bidimensional, por lo que también puede entenderse como que apunta a una matriz unidimensional. La figura 6-6 muestra esta relación.

int a[3][3]={1,2,3,4,5,6,7,8,9};

int *pa[3]= {a[0],a[1],a[2]};

int *p=a[0];

principal()

{

int i;

para(i=0;i<3;i++)

printf("%d,%d,%d/n ",a[i][2-i],*a[i],*(*(a+i)+i));

for(i=0;i<3;i++)

printf("%d,%d,%d/n",*pa[i],p[i],*(p+i));

}

En este programa de ejemplo, pa es una matriz de punteros y los tres elementos apuntan a cada fila de la matriz bidimensional a. Luego use una declaración de bucle para generar los elementos de la matriz especificados. Entre ellos, *a[i] representa el valor del elemento de la fila i y la columna 0 *(*(a+i)+i) representa el valor del elemento de la fila i y la columna *pa[i] representa el valor del elemento; de la fila y la columna i; dado que p y a[0] son ​​iguales, p[i] representa el valor de la fila 0 y la columna i *(p+i) representa el valor de la fila 0 y la columna i; El lector puede observar más de cerca las diversas formas en que se pueden representar los valores de los elementos. Debe prestar atención a la diferencia entre matrices de punteros y variables de puntero de matrices bidimensionales. Aunque ambos pueden usarse para representar matrices bidimensionales, sus métodos de representación y significados son diferentes