Te lleva a jugar fácilmente con funciones de lenguaje C

contenido

 

¿Qué es una función?

Clasificación de funciones en lenguaje C

Ejemplos de funciones de biblioteca

función strcpy()

 función memset()

función personalizada

argumentos de función

Parámetros reales (parámetros reales):

Parámetros formales (parámetros formales):

Llamada de función:

llamar por valor

llamar por dirección

ejemplo

 Escribe una función para verificar si un número es un año bisiesto

 Escribe una función para determinar si un año es un número primo

Escriba una función que implemente una búsqueda binaria de una matriz ordenada de enteros. 

tipo booleano

llamadas anidadas

acceso encadenado

valor de retorno de la función

Parámetros de la función principal


 

¿Qué es una función?

En matemáticas, a menudo vemos el concepto de funciones. Pero, ¿entiendes las funciones en lenguaje C? Definición de Wikipedia de una función: Subrutina En informática, una subrutina (en inglés: Subrutina, procedimiento, función, rutina, método, subprograma, unidad invocable) es una porción de código en un programa grande que consta de uno o más bloques de declaraciones. Es responsable de completar una tarea específica y es relativamente independiente de otro código. Por lo general, hay parámetros de entrada y valores de retorno, que proporcionan encapsulación y ocultación de los detalles del proceso. Estos códigos suelen estar integrados como bibliotecas de software.

Clasificación de funciones en lenguaje C

1. Funciones de biblioteca (funciones de biblioteca proporcionadas por el lenguaje C) 2. Funciones personalizadas (funciones escritas por usted mismo)

Ejemplos de funciones de biblioteca

Haga clic aquí para ver todas las funciones de la biblioteca

función strcpy()

marca de agua, type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5aS05Y-R5rKh5pyJ5Luj56CB5aSa,size_20,color_FFFFFF,t_70,g_se,x_16

Características:

copiar cadena

Copia la cadena C a la que apunta el origen en la matriz a la que apunta el destino , incluido el carácter nulo final (y deteniéndose en ese punto). Copiar (a,b) b a a, incluido \0 de b, sobrescribirá el contenido de a

marca de agua, type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5aS05Y-R5rKh5pyJ5Luj56CB5aSa,size_20,color_FFFFFF,t_70,g_se,x_16

 función memset()

marca de agua, type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5aS05Y-R5rKh5pyJ5Luj56CB5aSa,size_20,color_FFFFFF,t_70,g_se,x_16

Función: Establece  el primer número de bytes del  bloque de memoria apuntado por ptr al valor especificado (interpretado como un carácter sin signo) y establece el número de bytes hacia atrás de ptr al valor

marca de agua, type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5aS05Y-R5rKh5pyJ5Luj56CB5aSa,size_20,color_FFFFFF,t_70,g_se,x_16

función personalizada

ret_type fun_name(para1, * )

{ sentencia; // elemento de sentencia }

tipo de retorno ret_type

fun_name nombre de la función

parámetro de función para1

marca de agua, type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5aS05Y-R5rKh5pyJ5Luj56CB5aSa,size_20,color_FFFFFF,t_70,g_se,x_16

Las funciones no se intercambian en este punto porque: cuando el parámetro real se pasa al parámetro formal, el parámetro formal es una copia temporal del parámetro real

, las modificaciones de los parámetros formales no afectan a los parámetros reales.

marca de agua, type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5aS05Y-R5rKh5pyJ5Luj56CB5aSa,size_20,color_FFFFFF,t_70,g_se,x_16

Si queremos que el parámetro formal tenga un efecto en el parámetro real, debemos hacer una llamada de paso por dirección , para que podamos implementar correctamente la función que queremos. 

marca de agua, type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5aS05Y-R5rKh5pyJ5Luj56CB5aSa,size_20,color_FFFFFF,t_70,g_se,x_16

argumentos de función

Parámetros reales (parámetros reales):

Los parámetros reales pasados ​​a la función se denominan parámetros reales. Los argumentos pueden ser: constantes, variables, expresiones, funciones, etc. Independientemente del tipo de cantidades que sean los parámetros reales, deben tener valores definidos para poder pasar esos valores a los parámetros formales cuando se llama a la función.

Parámetros formales (parámetros formales):

Los parámetros formales se refieren a las variables entre paréntesis después del nombre de la función, porque los parámetros formales solo se instancian (unidades de memoria asignadas) en el proceso de llamada de la función, por lo que se denominan parámetros formales. Los parámetros formales se destruyen automáticamente cuando se completa la llamada a la función. Entonces, los parámetros formales solo son válidos dentro de las funciones.

marca de agua, tipo_d3F5LXplbmhlaQ, sombra_50, texto_Q1NETiBA5aS05Y-R5rKh5pyJ5Luj56CB5aSa, tamaño_15, color_FFFFFF, t_70, g_se, x_16

Cuando un parámetro real se pasa a un parámetro formal, el parámetro formal es una copia temporal del parámetro real, y las modificaciones al parámetro formal no pueden cambiar el parámetro real.

Llamada de función:

llamar por valor

Los parámetros formales y los parámetros reales de la función ocupan diferentes bloques de memoria respectivamente, y la modificación de los parámetros formales no afectará a los parámetros reales.

marca de agua, type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5aS05Y-R5rKh5pyJ5Luj56CB5aSa,size_20,color_FFFFFF,t_70,g_se,x_16

En este caso se realiza una llamada por valor, al ingresar a la función luego de la llamada por valor, automáticamente se crearán dos variables diferentes, y estas dos variables serán operadas dentro de la función, cuando finalice la función, estas dos variables serán liberado. , por lo que la modificación del parámetro formal no tendrá ningún efecto en el parámetro real

llamar por dirección

La llamada por referencia es una forma de llamar a una función pasando la dirección de memoria de una variable creada fuera de la función al parámetro de la función. Este método de pasar parámetros permite que la función establezca una conexión real con las variables fuera de la función, es decir, la función puede operar directamente las variables fuera de la función.

marca de agua, type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5aS05Y-R5rKh5pyJ5Luj56CB5aSa,size_20,color_FFFFFF,t_70,g_se,x_16

 Esta función se llama por referencia.Después de la llamada por referencia, cuando se ejecuta la función, la variable no se creará automáticamente, pero la dirección de la variable pasada se pasará a la función.En este momento, el contenido de la Se operará la dirección del parámetro real original. , la modificación del parámetro formal afectará el valor del parámetro real

marca de agua, type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5aS05Y-R5rKh5pyJ5Luj56CB5aSa,size_20,color_FFFFFF,t_70,g_se,x_16

Porque es una llamada de paso por referencia, pero si el parámetro formal * no se proporciona dentro de la función después de la llamada, cuando se ejecuta la función, encontramos que el parámetro real no cambia. Esto se debe a que px y py son ambos tipos int *, apuntando a num1 y la dirección de num2, si opera en px py, es para intercambiar sus direcciones, pero no tiene efecto en el contenido de sus direcciones.

ejemplo

 Escribe una función para verificar si un número es un año bisiesto

marca de agua, type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5aS05Y-R5rKh5pyJ5Luj56CB5aSa,size_20,color_FFFFFF,t_70,g_se,x_16

#include <stdio.h>
int is_leap_year(int y)
{
	if (((y % 4 == 0) && (y % 100 != 0)) || (y % 400 == 0))
		return 1;
	else
		return 0;
}

int main()
{
	int year = 0;
	for (year = 1000; year <= 2000; year++)
	{
		//判断year是不是闰年
		if (is_leap_year(year))
		{
			printf("%d ", year);
		}
	}
	return 0;
}

 Escribe una función para determinar si un año es un número primo

marca de agua, type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5aS05Y-R5rKh5pyJ5Luj56CB5aSa,size_20,color_FFFFFF,t_70,g_se,x_16

 

#include <stdio.h>
#include<math.h>
int is_prime(int n)
{
	int j = 0;
	for (j = 2; j <= sqrt(n); j++)
	{
		if (n % j == 0)
		{
			return 0;
		}
	}

	return 1;
}

int main()
{
	int i = 0;
	int count = 0;
	for (i = 101; i <= 200; i+=2)
	{
		if (is_prime(i)==1)
		{
			printf("%d ", i);
			count++;
		}
	}
	printf("\ncount = %d\n", count);
	return 0;
}

Escriba una función que implemente una búsqueda binaria de una matriz ordenada de enteros. 

marca de agua, type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5aS05Y-R5rKh5pyJ5Luj56CB5aSa,size_20,color_FFFFFF,t_70,g_se,x_16

#include <stdio.h>
int binary_search(int a[],int x,int y,int z)
{
	
	while (x <= y)
	{
		int  mid = x + (y - x) / 2;
		if (z ==a[ mid])
		{
			return mid;
		}
		else if (z>a[ mid])
		{
			x = mid + 1;
		}
		else if (z < a[mid])
		{
			y = mid - 1;
		}
	}
	if (x > y)
		return -1;
}

int main()
{
	int a[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int left = 0;
	int right = sizeof(a) / sizeof(a[0]);
	int k = 0;
	scanf("%d", &k);
	int h=binary_search(a, left, right,k);
	if (h == -1)
		printf("没找到");
	else
		printf("找到了,下表是:%d", h);
	return 0;
}

 Cuando calculamos el tamaño de la matriz dentro de la función, el tamaño de la matriz se convertirá en 1. Esto se debe a que la dirección del primer elemento se pasa cuando se pasa el parámetro a la matriz. El int a[] del parámetro de la función parece ser una matriz, pero en realidad es un puntero, que acepta la dirección del primer elemento

Entonces int y = tamaño de (a) / tamaño de (a [0])

sizeof(a) es en realidad el tamaño de la variable del puntero, sizeof a[0] es el tamaño del primer elemento, el tamaño del puntero es 4 u 8, y a[0] es 4, por lo que el resultado final es 1

marca de agua, type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5aS05Y-R5rKh5pyJ5Luj56CB5aSa,size_20,color_FFFFFF,t_70,g_se,x_16

 Esta es una demostración incorrecta.

El parámetro de matriz en realidad pasa la dirección del primer elemento de la matriz

en lugar de toda la matriz

Por lo tanto, no es confiable calcular la cantidad de elementos de una matriz en la parte del parámetro de una función dentro de una función

int binary_search(int a[])//El parámetro formal a parece una matriz, que es esencialmente una variable de puntero

tipo booleano

bool: variable utilizada para representar verdadero y falso

como bandera bool

Solo hay dos casos para que la bandera devuelva verdadero o devuelva falso

Archivo de encabezado #include<stdbool.h>

marca de agua, tipo_d3F5LXplbmhlaQ, sombra_50, texto_Q1NETiBA5aS05Y-R5rKh5pyJ5Luj56CB5aSa, tamaño_14, color_FFFFFF, t_70, g_se, x_16

marca de agua, type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5aS05Y-R5rKh5pyJ5Luj56CB5aSa,size_20,color_FFFFFF,t_70,g_se,x_16

llamadas anidadas

marca de agua, type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5aS05Y-R5rKh5pyJ5Luj56CB5aSa,size_20,color_FFFFFF,t_70,g_se,x_16

#include <stdio.h>
void new_line()
{
    printf("hehe\n");
}
void three_line()
{
    int i = 0;
    for (i = 0; i < 3; i++)
    {
        new_line();
    }
}
int main()
{
    three_line();
    return 0;
}

 Las funciones pueden llamarse anidadas, pero no pueden definirse como anidadas

marca de agua, type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5aS05Y-R5rKh5pyJ5Luj56CB5aSa,size_20,color_FFFFFF,t_70,g_se,x_16

 Si la definición está anidada, la función informará un error.

acceso encadenado

El valor de retorno de una función, como argumento para otras funciones.

marca de agua, type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5aS05Y-R5rKh5pyJ5Luj56CB5aSa,size_20,color_FFFFFF,t_70,g_se,x_16

marca de agua, tipo_d3F5LXplbmhlaQ, sombra_50, texto_Q1NETiBA5aS05Y-R5rKh5pyJ5Luj56CB5aSa, tamaño_16, color_FFFFFF, t_70, g_se, x_16

valor de retorno de la función

La función no escribe un valor de retorno y el tipo de retorno predeterminado es Int. Cuando una función con un tipo int no tiene valor de retorno, en algunos compiladores, el programa devolverá el valor de retorno de la última instrucción de forma predeterminada.

 marca de agua, tipo_d3F5LXplbmhlaQ, sombra_50, texto_Q1NETiBA5aS05Y-R5rKh5pyJ5Luj56CB5aSa, tamaño_19, color_FFFFFF, t_70, g_se, x_16marca de agua, tipo_d3F5LXplbmhlaQ, sombra_50, texto_Q1NETiBA5aS05Y-R5rKh5pyJ5Luj56CB5aSa, tamaño_17, color_FFFFFF, t_70, g_se, x_16

 

No se recomienda esta forma de escribir.

marca de agua, tipo_d3F5LXplbmhlaQ, sombra_50, texto_Q1NETiBA5aS05Y-R5rKh5pyJ5Luj56CB5aSa, tamaño_17, color_FFFFFF, t_70, g_se, x_16

 marca de agua, type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5aS05Y-R5rKh5pyJ5Luj56CB5aSa,size_20,color_FFFFFF,t_70,g_se,x_16

 

 

Se ha pasado 100, pero no se usa. Si desea rechazar este 100, puede agregar void. En este momento, el compilador generará una alarma, pero el programa aún se ejecutará correctamente.

Parámetros de la función principal

marca de agua, tipo_d3F5LXplbmhlaQ, sombra_50, texto_Q1NETiBA5aS05Y-R5rKh5pyJ5Luj56CB5aSa, tamaño_10, color_FFFFFF, t_70, g_se, x_16

 

 

 

 

 

Supongo que te gusta

Origin blog.csdn.net/weixin_49449676/article/details/124229655
Recomendado
Clasificación