Preguntas de prueba escritas de lenguaje c incrustado

En este artículo, echemos un vistazo a las preguntas de prueba escritas del lenguaje C integrado. El contenido principal de este artículo es el siguiente:

¿Por qué la industria integrada presta atención a la investigación del lenguaje C?

En primer lugar, resolvamos primero el primer problema, ¿por qué la industria integrada presta atención a la investigación del lenguaje C? ¿O por qué el desarrollo integrado se desarrolla en lenguaje c, y por qué el lenguaje c es tan popular en la industria integrada entre tantos lenguajes de programación?

La excelente portabilidad y el acceso directo al hardware del lenguaje C lo hacen muy adecuado para el desarrollo y uso en la industria integrada. De hecho, hay lenguajes ensamblador y C que pueden acceder directamente al hardware, pero el lenguaje ensamblador es un lenguaje de bajo nivel y es difícil completar algunas funciones complejas.Este lenguaje de programación de intercambio extranjero está estrechamente relacionado con la arquitectura del CPU: los códigos de ensamblaje de la arquitectura X86 y la arquitectura ARM son diferentes, lo que viola el principio de portabilidad en el desarrollo integrado. Sin embargo, el ensamblaje es más eficiente para acceder al hardware que el lenguaje C. Por lo tanto, el trabajo de inicialización del hardware generalmente se asigna al ensamblaje y las operaciones más complejas se asignan al lenguaje C.

Las limitaciones de otros lenguajes orientados a objetos y la incapacidad de operar directamente el hardware hacen que el lenguaje C tenga una posición y un papel insustituibles en el desarrollo integrado.

Varios temas de las preguntas comunes de las pruebas escritas del lenguaje C incrustado

tipo de datos

1. Use la variable a para definir los siguientes tipos de variables

(1) Un número entero

(2) Un puntero a un entero

(3) Un puntero a un puntero, el puntero puntiagudo apunta a un número entero

(4) Una matriz con diez enteros

(5) Una matriz con 10 punteros, los elementos de la matriz apuntan a un número entero

(6) Un puntero a una matriz de 10 enteros

(7) Un puntero a una función que toma un parámetro entero y devuelve un número entero

(8) Una matriz de 10 punteros a una función que toma un parámetro entero y devuelve un número entero

Respuesta:

(1) int a;

(2)int *a;

(3)int **a;

(4)int a[10];

(5)int *a[10];

(6)int (*a)[10];

(7)int(*a)(int);

(8)int (*a[10])(int);

Análisis:

Hay dos formas de probar esta pregunta: una es dar los requisitos y escribir la declaración de definición por ti mismo, y la otra es dar la declaración de definición y escribir el significado de la variable a por ti mismo.

La solución es dominar algunos principios. Primero, aquí hay una imagen para todos. La siguiente imagen describe la prioridad de los operadores en lenguaje C.

Entonces mire cuál es la esencia de esta variable. Cuanto más se acerque a la definición de la esencia, mayor será su prioridad. ¿Qué significa? Analicemos dos variables para tener una idea de

Una matriz con 10 punteros, los elementos de la matriz apuntan a un número entero: int *a[10];

Un puntero a una matriz de 10 enteros: int (*a)[10];

De la imagen de la prioridad del operador anterior, podemos saber que la prioridad de [] es mayor que *, por lo que en int *a[10];, la esencia de a es una matriz, y luego los miembros de datos almacenados en la matriz son punteros y los miembros de datos apunta a datos enteros.

¿Qué pasa con int (*a)[10]; Aquí, los paréntesis se usan para encerrar *a para enfatizar que la esencia de a es un tipo de puntero, a apunta a una matriz y la matriz apuntada tiene diez datos enteros.

Después de distinguir las matrices de punteros y los punteros de matriz, puede intentar analizar otros tipos de datos complejos.Puede observar el requisito de escribir una declaración de definición o mirar la declaración de definición para escribir el significado de la variable a.

2. El siguiente es un programa C de 32 bits bajo Linux/Windows, calcule el valor de sizeof

1. función vacía (cadena de caracteres [100]);  

2.int main(int argc, const char *argv[])  

3.{  

4. char str[] = "hola";  

5. carácter *p = cadena;  

6. int n = 10;  

7. char str_fun[100];  

8. vacío*p_malloc = malloc(100);  

9. printf("tamaño(cadena) = %d\n",tamaño(cadena));  

10. printf("tamaño(p) = %d\n",tamaño(p));  

11. printf("tamaño(n) = %d\n",tamaño(n));  

12. func(str_fun);  

13. printf("tamaño(p_malloc) = %d\n",tamaño(p_malloc));  

14. devuelve 0;  

15.}  

16. función vacía (cadena de caracteres [100])  

17.{  

18. printf("tamaño(cadena) = %d\n",tamaño(cadena));  

19.}  

Respuesta:

1.tamaño(str) = 6  

2. tamaño de (p) = 4  

3. tamaño de (n) = 4  

4.tamaño(str) = 4  

5. tamaño de (p_malloc) = 4  

Analizar gramaticalmente:

En primer lugar, el primer cálculo es la longitud en bytes de la matriz str, str es la longitud determinada al asignar el valor inicial, y su longitud es "hola\0" ​​con una longitud total de 6 caracteres, es decir, 6 bytes   

El segundo cálculo es la longitud en bytes del puntero p, sin importar a qué tipo de datos apunte el puntero, su longitud en bytes es 4. 

El tercer cálculo es la longitud en bytes de la variable entera n Bajo el sistema de 32 bits, los datos enteros ocupan 4 bytes. 

El cuarto es la longitud en bytes del parámetro formal str calculado en la subfunción.Para el parámetro formal de la función, ya sea una matriz o un puntero, su esencia es un puntero, por lo que su longitud en bytes es de 4 bytes.   

El quinto cálculo es la longitud en bytes del puntero p_malloc. Aunque apunta a un espacio de memoria de 100 bytes, su esencia sigue siendo un puntero, que sigue siendo de 4 bytes.

Palabras clave y preprocesamiento

1. ¿Cuál es el papel de la palabra clave estática?

respuesta:

(1) En el cuerpo de la función, el alcance de la variable estática es la función. A diferencia de la variable automática, la memoria de la variable solo se asigna una vez, por lo que su valor mantendrá el último valor cuando se llame la próxima vez.

(2) Todas las funciones del módulo pueden acceder a las variables globales estáticas del módulo, pero otras funciones fuera del módulo no pueden acceder a ellas.

(3) Una función estática en un módulo solo puede ser llamada por otras funciones en este módulo, y el alcance del uso de esta función está limitado al módulo en el que se declara.

2. ¿Cuál es el papel de la palabra clave const?

respuesta:

(1) Para evitar que se cambie una variable, puede usar la palabra clave const. Al definir la variable, generalmente se inicializa, porque no hay posibilidad de cambiarla más tarde.

(2) Para los punteros, puede especificar el propio puntero, también puede especificar los datos a los que apunta el puntero, o ambos pueden especificarse como const.

(3) En la declaración de la función, const puede modificar el parámetro formal, indicando que es un parámetro de entrada, y su valor no se puede cambiar dentro de la función.

3. ¿Cuáles son las ventajas de const sobre #define?

respuesta:

(1) La variable de solo lectura modificada con const tiene un tipo de datos específico y la macro no tiene ningún tipo de datos. El compilador puede realizar comprobaciones de seguridad de tipo en la primera y solo realizar el reemplazo de caracteres en la última, sin comprobaciones de seguridad de tipo.

(2) Por lo general, el compilador no asigna espacio de almacenamiento para las variables constantes ordinarias de solo lectura, sino que las guarda en la tabla de símbolos, lo que hace saber durante la compilación que no hay ninguna operación de almacenamiento en la memoria de lectura, lo que la hace más eficiente.

4. ¿Cuál es la diferencia entre enumeración y #define macro?

respuesta:

Resumen de enumeraciones y macros  

(1) Enumeración: se refiere a enumerar los valores de las variables uno por uno, y los valores de las variables están limitados al rango de los valores enumerados   

(2) #define La definición de macro es usar un identificador específico para representar una cadena

La diferencia entre enumeración y #define macro   

(1) Las variables de enumeración se pueden depurar en el compilador, pero las constantes de macro no se pueden depurar   

(2) Las constantes macro #define simplemente se reemplazan en la etapa de precompilación. Las constantes de enumeración se determinan en tiempo de compilación   

(3) Las enumeraciones pueden definir una gran cantidad de constantes relacionadas a la vez, mientras que las macros #define solo pueden definir una a la vez.

5. ¿Cuáles son las similitudes y diferencias entre typedef y #define macro?

respuesta:

(1) Similitudes: por lo general, se puede entender como un alias para un personaje, y se usa un nuevo personaje para reemplazar el personaje original en el programa.   

(2) diferencia  

a. El significado real es diferente, #define es un reemplazo de cadena, typedef es un tipo diferente para el tipo

b. No hay un punto y coma al final de la oración de la definición de macro como marca final, que no se realiza durante el proceso de compilación en sí, pero ya se completó durante el proceso de preprocesamiento. Es difícil encontrar posibles errores.

Punteros y errores de segmentación

1. ¿Cuál es la relación entre punteros, matrices y direcciones?

respuesta:

(1) La matriz se almacena en una unidad de memoria continua, y el nombre de la matriz es la primera dirección de la unidad de memoria continua, y la dirección de la unidad de memoria es un puntero, por lo que el nombre de la matriz también es un puntero.

(2) La matriz se compone de múltiples elementos de matriz, y el tamaño de la memoria continua ocupada por los elementos es diferente según el tipo de matriz. La primera dirección de un elemento de un arreglo es la primera dirección de la unidad de memoria continua que ocupa.

(3) Una variable de puntero puede apuntar a una matriz o a un elemento de matriz. Asigne el nombre de la matriz o la dirección del primer elemento de la matriz al puntero y el puntero apuntará a una matriz. Si desea que la variable puntero apunte al elemento i-ésimo, puede asignarle la primera dirección del elemento i.

2. Cómo usar punteros para representar arreglos multidimensionales

respuesta:

Por ejemplo: supongamos que a es el nombre de una matriz bidimensional y a representa la primera dirección de toda la matriz bidimensional

n a+i, a[i], (a+i), &a i son equivalentes,  

a[i]+j=(*(a+i)+j) El valor de este elemento es igual a *(*(a+i)+j)

3. ¿Cómo se aplican los punteros secundarios a los arreglos unidimensionales?

respuesta:

int a=[10],*p1,**p2,i;

p1=a;

p2=&p1;

a[i]=*(*p2+i)=* (p1+i)=*(a+i)

Funciones relacionadas con cadenas

1.size_t strlen(const char *s); 

Función: Calcular la longitud de la cadena 

Parámetros: s: matriz de caracteres 

Valor devuelto: devuelve la longitud real de la cadena, excluyendo '\0'

1.//Impleméntalo tú mismo

2.int my_strlen(const char *s)  

3.{  

4. carácter * sc;  

5. para (sc = s; *sc != '\0'; ++sc);  

6. volver sc - s;  

7.}  

2.char *strcpy(char *dest, const char *src); 

Función: copiar los datos de src a dest 

Parámetros: dest: matriz de caracteres de destino src: matriz de caracteres de origen 

Valor de retorno: la matriz de caracteres copiada 

Descripción: la matriz de caracteres dest 1 debe ser lo suficientemente grande 

Antes de la conexión, ambas cadenas terminan con '\0'; después de la conexión, el '\0' de dest se cancela y se agrega '\0' al final de la nueva cadena

1.//Impleméntalo tú mismo  

2.char *my_strcpy(char *dest, const char *src)  

3.{  

4. int yo;  

5. while(fuente[i] != '\0')  

6. {  

7. destino[i] = origen[i];  

8. i++;  

9. }  

10  

11. destino[i] = '\0';  

12. destino de regreso;  

13.}  

3.char *strcat(char *dest, const char *src); 

Función: agregar los datos de src a dest 

Parámetros: dest: matriz de caracteres de destino src: matriz de caracteres de origen 

Valor devuelto: Igual que el destino final 

Explicación: la matriz de caracteres 1 debe ser lo suficientemente grande 

Antes de la conexión, ambas cadenas terminan con '\0'; después de la conexión, se cancela '\0' en la cadena 1 y se agrega '\0' al final de la nueva cadena.

1.//Impleméntalo tú mismo  

2.char *strcat(char *dest, const char *src)  

3.{  

4. int i = 0, j = 0;  

5. while(destino[i] != '\0'){  

6. yo++;  

7. }  

8. while(origen[j] != '\0'){  

9. destino[i++] = origen[j++];  

10. }  

11. destino[i] = '\0';  

12. destino de regreso;  

13.}  

4.int strcmp(const char *s1, const char *s2); 

Función: comparar la longitud de dos cadenas 

Valor de retorno: si la cadena 1 < cadena 2, devuelve un entero negativo 

Si cadena 1 > cadena 2, devuelve un entero positivo 

Si cadena1 == cadena2, devuelve cero 

ilustrar: 

Compare las dos cadenas una por una de izquierda a derecha (código ASCII), hasta que encuentre un carácter diferente o '\0' 

No puede usar "==" para la comparación de cadenas, debe usar strcmp

1.//Impleméntalo tú mismo  

2.int my_strcmp (const char *s1, const char *s2)  

3.{  

4. intret;  

5. while ((ret = *(caracter sin signo *) s1 - *(caracter sin signo*) s2++) == 0 && *s1++);  

6. retorno ret;  

7.}  

lista enlazada

Lo más complicado en la lista enlazada es la lista enlazada circular bidireccional. Muéstreme la lista enlazada circular bidireccional. Creo que si la lista enlazada circular bidireccional se puede entender completamente, la lista enlazada circular unidireccional es ningún problema.

1. Lista enlazada circular bidireccional

1.//lista de enlaces.h  

2.#ifndef __LINKLIST_H__  

3.#definir __LISTA_ENLACE_H__  

4.#incluir   

5.#incluir   

6.//Lista circular doblemente enlazada  

7.typedef tipo de datos int;  

8.typedef struct dnodo{  

9. datos de tipo de datos;  

10. struct dnode *anterior;  

11. struct dnode *siguiente;  

12.}DLinkList, *DLinkList_p;  

13.DLinkList_p creat_dlinklist(vacío);  

14.DLinkList_p getnode_dlinklist(DLinkList_p D, int pos);  

15.int insert_dlinklist(DLinkList_p D, valor de tipo de datos, int pos);  

16.void show_dlinklist(DLinkList_p D);  

17.int delete_dlinklist(DLinkList_p D, int pos);  

18.#endif  

1.// lista de enlaces.c  

2.#incluye "listadeenlaces.h"  

3.DLinkList_p creat_dlinklist(vacío){  

4. DLinkList_p D = NULO;  

5. D = (DLinkList *) malloc (tamaño de (DLinkList));  

6. si (NULO == D){  

7. printf("¡Error de malloc!\n");  

8. devuelve NULL;  

9. }  

10. D->datos = 0;  

11. D->anterior = D;  

12. D->siguiente = D;  

13. vuelta D;  

14.}  

15.DLinkList_p getnode_dlinklist(DLinkList_p D, int pos){  

16. if(NULL == D){ printf("D es NULL"); devuelve NULL; }  

17. if(pos < 0){ printf("¡Error de pos!\n"); devuelve NULL; }  

18. int i = 0;   

19. DLinkList_p p = D->siguiente;  

20. while( p != D && i <pos){  

21. p = p->siguiente;  

22. i++;  

23. }  

24. if(p == D){ printf("pos > longitud\n"); devuelve NULL; }  

25. si(i == pos){ devuelve p; }  

26. printf("pos > longitud!\n");  

27. devuelve NULL;  

28.}  

29.//Insertar función  

30.int insert_dlinklist(DLinkList_p D, valor de tipo de datos, int pos){  

31. DLinkList_p nuevo = NULL; DLinkList_p Q = NULO;  

32. if(NULL == D){ printf("D es NULL\n"); devolver -1; }  

33. if(pos < 0){ printf("¡Error de pos!\n"); devolver -1; }  

34. else if( D->siguiente == D ){ Q = D; }  

35. else{ Q = getnode_dlinklist(D, pos); }  

36. if( NULL == Q ){ printf("Q obtiene NULL\n"); devolver -1; }  

37.      

38. nuevo = (DLinkList *) malloc (tamaño de (DLinkList));  

39. si (NULO == nuevo){  

40. printf("¡Error de malloc!\n");  

41. devolver -1;  

42. }  

43. nuevo->dato = valor;  

44. nuevo->siguiente = Q;  

45. nuevo->anterior = Q->anterior;  

46. ​​P->anterior->siguiente = nuevo;  

47. Q->anterior = nuevo;  

48. devuelve 0;  

49.}  

50.//Borrar  

51.int delete_dlinklist(DLinkList_p D, int pos){  

52. DLinkList_p del = NULL;  

53. if(NULL == D){ printf("D es NULL\n"); devolver -1; }  

54. if(pos < 0){ printf("¡Error de pos!\n"); devolver -1; }   

55. else{ del = getnode_dlinklist(D, pos); }  

56. if( NULL == del ){ printf("Q obtiene NULL\n"); devolver -1; }  

57.      

58. del->anterior->siguiente = del->siguiente;  

59. del->siguiente->anterior = del->anterior;  

60. libre (del);  

61.    del = NULL;  

62. devuelve 0;  

63.}  

64.void show_dlinklist(DLinkList_p D){  

65. if(NULL == D){ printf("D es NULL\n"); devolver; }  

66. DLinkList_p p = D->siguiente;  

67. while(p != D){  

68. printf("%d\n", p->datos);  

69. p = p->siguiente;  

70. }  

71.}  

El Internet integrado de las cosas necesita aprender mucho. ¡No aprenda la ruta y el contenido equivocados, lo que hará que su salario aumente!

Comparte un paquete de datos con todos, unos 150 G. ¡El contenido de aprendizaje, las escrituras cara a cara y los proyectos son relativamente nuevos y completos! (Haga clic para encontrar un pequeño asistente para recibir)

Supongo que te gusta

Origin blog.csdn.net/m0_70911440/article/details/131591260
Recomendado
Clasificación