Preguntas de entrevista clásicas que se encuentran a menudo en entrevistas C / C ++

Inserte la descripción de la imagen aquí
Si quieres ir a la entrevista de C ++, échale un vistazo. Busqué en Internet, lo vi, así que lo resolveré.

1. ¿Cuál es la diferencia entre declaración y definición de variable?

Constante: la cantidad que no cambiará durante la ejecución del programa y la cantidad que no se puede cambiar.
Variable: la cantidad que se puede cambiar durante la ejecución del programa. Cómo
definir variables: tipo de datos nombre de la variable = constante;
int num = 10; // Definir (asignar espacio de almacenamiento, el valor inicial es constante)
int num; // definir declaración (asignar espacio de almacenamiento, asignar valor de basura)
extern int num; // declaración referencial referir declaración, (no asignar espacio de almacenamiento, No asigne valor basura) no se limita al uso de este documento.
• La definición de una variable se utiliza para asignar espacio de almacenamiento para la variable y también puede especificar un valor inicial para la variable. En un programa, una variable tiene una y solo una definición
. En circunstancias normales, a menudo la describimos así. La declaración que crea espacio se llama "definición", y la declaración que no necesita crear espacio de almacenamiento se llama "declaración". Obviamente, la declaración a la que nos referimos aquí es una declaración más restringida, es decir, una declaración en sentido estricto, es decir, una declaración sin definición
. Cuando se declara una función, el compilador no asigna una dirección de entrada a la
función. Cuando se define una función, el segmento de código de función Se coloca en el bloque de código, incluso si se asigna espacio de almacenamiento a la función en este momento, el nombre de la función asigna la dirección de entrada de la función.
• El propósito final de la declaración es usarlo de antemano, es decir, usarlo antes de la definición. Si no necesita usarlo de antemano, no es necesario declarar por separado. Este es el caso de variables y funciones. Por lo tanto, la declaración no asigna espacio de almacenamiento, y solo asigna cuando está definido almacenamiento

2. Escriba una declaración if que compare una variable de puntero flotante bool int con un valor cero

Datos de tipo bool
If (bandera)
If (! Bandera)

Datos int:
if (0! = Flag)
If (0 == flag)

Datos del puntero:
if (NULL == flag)
If (NUJLL! = Flag)

Flotante 型 数据 :
Define NORM 0.00001;
si (bandera> = - NORM && bandera <= NORM)

Nota: Preste especial atención a cuando compare int, la variable de puntero y el valor cero, coloque el valor cero a la izquierda, de modo que cuando == se escriba incorrectamente como =, el compilador pueda informar un error; de lo contrario, el error lógico no es fácil de encontrar y puede Lleva a consecuencias muy graves.

3. La diferencia entre sizeof y strlen

La diferencia entre sizeof y strlen es la siguiente:
sizeof es un operador, strlen es
el parámetro de la función de biblioteca sizeof, que puede ser el tipo de datos o una variable, y strlen solo puede ser una cadena que termina con '\ 0' como parámetro.
El compilador compila y calcula el resultado de sizeof, y se debe ejecutar la función strlen para calcularlo. Y sizeof calcula el tamaño de la memoria ocupada por el tipo de datos, mientras que strlen calcula la longitud real de la cadena. La
matriz no se degenera como parámetro de sizeof, y el paso de strlen degenera en un puntero.
Nota: Algunos operadores parecen funciones y algunos nombres de funciones parecen operadores. Estos nombres confusos deben distinguirse; de ​​lo contrario, es fácil cometer errores al encontrar tipos de datos especiales, como nombres de matrices como parámetros. . El operador que se confunde más fácilmente como función es sizeof.

4. ¿Cuál es la diferencia entre la palabra clave estática del lenguaje C y la palabra clave estática de C ++?

En C, static se usa para modificar variables estáticas locales y variables y funciones estáticas externas. Además de las funciones anteriores, C ++ también se usa para definir las variables miembro y las funciones de la clase, es decir, las variables miembro estáticas y las funciones miembro estáticas.
Nota: La memoria estática y las características globales de la programación pueden permitir que las funciones sean llamadas en diferentes períodos para realizar La comunicación, la transferencia de información y el miembro estático de C ++ pueden comunicar y transferir información entre múltiples instancias de objetos.

5. ¿Cuál es la diferencia entre malloc en cy new en c ++?

Malloc y new tienen las siguientes diferencias:
new y delete son operadores y se pueden sobrecargar.
Malloc solo se puede usar en C ++ . Free es una función que se puede sobrescribir.
New se puede usar tanto en C como en C ++ para llamar al constructor del objeto. delete llama al destructor correspondiente
Malloc solo asigna memoria, free solo recupera memoria y no ejecuta el constructor y destructor.
New delete devuelve un puntero de un determinado tipo de datos, malloc free devuelve un puntero vacío.
Nota: la memoria solicitada por malloc El espacio debe liberarse con free y el espacio de memoria solicitado por new debe liberarse con delete. No se confunda, porque los dos mecanismos de implementación son diferentes

6. Escriba una macro estándar MIN

#define min (a, b) ((a) <= (b)? (a) :( b))
Nota: Asegúrese de prestar atención a los efectos secundarios de esta macro definición al llamar, llame de la siguiente manera
(++ * p) <( x)? (++ * p) :( x) El
puntero P se ha agregado dos veces, lo que viola la intención original de MIN.

7. ¿Se puede volver volátil un puntero?

Volátil se utiliza en los siguientes lugares:
1. Las variables modificadas en el programa de servicio de interrupciones para su detección por otros programas necesitan agregar volátiles;
2. Las banderas compartidas entre tareas en un entorno multitarea deben agregar volátiles;
3. Registros de hardware mapeados en memoria Por lo general, también se agrega una descripción volátil, porque cada lectura y escritura puede tener un significado diferente;
Inserte la descripción de la imagen aquí

8. ¿Cuál es la diferencia entre ay & a?

Escriba el resultado de impresión del siguiente código, el propósito principal es examinar la diferencia entre
ay & a #include <stdlo.h>
Void main ()
{ Int a [5] = {1,2,3,4,5}; Int * ptr = (int ) (& a + 1); Printf ("% d,% d", (a + 1), (ptr-1)); Return; }




Resultado de la salida: 2,5
Nota: El nombre de la matriz a se puede usar como la primera dirección de la matriz y & a es un puntero a la matriz.
Piénselo,
cuál será la salida cuando el original int * ptr = (int *) (& a + 1); debería ser int * ptr = (int *) (a + 1)

9 Describa brevemente la asignación de memoria de la compilación de programas C y C ++

(1) Asignación desde el área de almacenamiento estático: la
memoria se asigna cuando se compila el programa. Esta memoria existe durante todo el período de ejecución del programa. Es rápida y sin errores, porque el sistema limpiará, por ejemplo, variables globales, variables estáticas etc.
(2) asignados en la pila:
cuando se ejecuta la función, la función de la unidad de almacenamiento de variables locales se crea en la pila, la función de estas celdas de memoria se libera automáticamente al final de la operación de asignación de memoria de la pila de ejecución para centrarse en el procesador de instrucciones construido , Alta eficiencia, pero la capacidad de memoria asignada es limitada.
(3) Asignación desde el montón:
asignación de memoria dinámica. Cuando el programa se está ejecutando, use malloc o new para solicitar cualquier tamaño de memoria. El programador es responsable de cuándo liberar la memoria con free o delete. El programador determina la vida útil de la memoria dinámica, y su uso es muy flexible. Si se asigna espacio en el montón, es responsabilidad de recuperarlo; de lo contrario, el programa en ejecución tendrá pérdidas de memoria. Además, la asignación y liberación frecuentes de diferentes tamaños de espacio de almacenamiento dinámico Genera escombros en el montón.
Cuando se compila un programa C, C ++, la memoria se divide en 5 áreas de almacenamiento: área de pila, área de pila, área global, área de constante de texto y área de código de programa

10 Describa brevemente la diferencia entre strcpy, sprintf y memecpy

Las tres diferencias principales son las siguientes
(1) Los objetos de operación son diferentes: los dos objetos de operación de strcpy son cadenas, los objetos de operación de sprintf pueden ser múltiples tipos de datos y el objeto de operación de destino es una cadena, y los dos objetos de memcpy son Dos direcciones de memoria operables arbitrarias no están limitadas a ningún tipo de datos.
(2) La función de ejecución es diferente: strcpy principalmente realiza la copia entre variables de cadena, sprintf principalmente realiza la conversión de otros formatos de tipo de datos a tipos de cadena, memcpy es principalmente la copia entre bloques de memoria
(3) La eficiencia de ejecución es diferente: memcpy es la más alta, sprintf
Nota más baja : strcpy, sprintf, memcpy pueden realizar la función de copia, pero el objetivo es diferente, de acuerdo con las necesidades reales, elija la función adecuada para realizar la función de copia

11. Establezca el valor de la variable entera cuya dirección es ox67a9 en oxaa66

int * ptr;
Ptr = (int *) ox67a9;
* Ptr = oxaa66;
Nota: Esta pregunta es un ejemplo típico de conversión de tipo forzada, sin importar la plataforma, la longitud de la dirección y la longitud de los datos enteros son iguales, es decir, un entero Los datos se pueden convertir en un tipo de puntero de dirección, siempre que tenga sentido.

12. Tres características de la orientación a objetos

Las tres características de la orientación a objetos son encapsulación, herencia y polimorfismo.

13. ¿Cuáles son las funciones miembro de la clase vacía de C ++?

(1) El constructor predeterminado
(2) El constructor de copia predeterminado
(3) El destructor predeterminado
(4) El operador de asignación predeterminado
(5) El operador de dirección predeterminado
(6) El acceso predeterminado Address operator const
Nota: Algunos libros simplemente presentan las primeras cuatro funciones sin mencionar las últimas dos funciones, pero las últimas dos funciones también son las funciones predeterminadas de la clase vacía. Además, la medicina occidental presta atención a que el compilador solo definirá estas funciones cuando se utilicen realmente.

14. Hable sobre sus conocimientos sobre constructores de copias y operadores de asignación.

La sobrecarga del constructor de copia y del operador de copia tienen las siguientes dos diferencias:
(1) El constructor de copia genera un nuevo objeto de clase, y la operación de asignación no puede
(2) Dado que el constructor de copia construye directamente un nuevo objeto de clase, se inicializa Este objeto no necesita verificar si el objeto de origen es el mismo que el objeto recién creado, y el operador de asignación requiere esta operación. Además, si la memoria en el objeto original no está asignada en el operador de asignación, la memoria debe liberarse primero.
Nota: Cuando la clase tiene un tipo de puntero Al crear variables miembro, debe reescribir el constructor de copia y el operador de asignación en lugar de utilizar los predeterminados.

15. Describa brevemente la diferencia entre reescribir, sobrecargar y ocultar funciones de miembros de clase.

(1) La anulación y la sobrecarga son principalmente diferentes en los siguientes puntos: Diferencia en el
alcance: las funciones anuladas y anuladas están en dos clases, y
la diferencia entre los parámetros de la función sobrecargada y sobrecargada en la misma clase. : La lista de parámetros de la función reescrita y la función reescrita deben ser la misma, y ​​la lista de parámetros de la función sobrecargada y la función sobrecargada deben ser diferentes.
Diferencia virtual: la función reescrita en la clase base reescrita debe tener virtual La modificación y las funciones sobrecargadas y las funciones sobrecargadas pueden modificarse virtualmente o no.
(2) Oculto y anulado. La sobrecarga tiene las siguientes diferencias:
el alcance de la sobrecarga es diferente. Al igual que la anulación, la función oculta y la función oculta no están en la misma clase.
La diferencia entre los parámetros: función oculta y función oculta La lista de parámetros puede ser igual o diferente, pero el nombre de la función debe ser el mismo. Cuando los parámetros no son los mismos, independientemente de si los parámetros de la clase base son modificados por virtual o no, las funciones de la clase base se ocultan en lugar de anularse.
Nota: Aunque tanto la sobrecarga como la anulación son la base para lograr el polimorfismo, las tecnologías que implementan son completamente diferentes y sus objetivos son completamente diferentes. La anulación es un polimorfismo enlazado dinámicamente, mientras que la sobrecarga está más enlazada estáticamente. estado

16. Describe brevemente el principio de polimorfismo.

Cuando el compilador encuentra una función virtual en una clase, inmediatamente generará una tabla de función virtual vtable para esta clase. Las entradas en la tabla de función virtual son punteros a la función virtual correspondiente. El compilador también insertará implícitamente un puntero en esta clase. vptr (para el compilador vc, se inserta en la primera posición de la clase) apunta a la tabla de funciones virtuales. Cuando se llama al constructor de esta clase, el compilador ejecutará implícitamente el código asociado de vptr y vtable, y apuntará vptr a La vtable correspondiente vincula la clase con la vtable de esta clase. Además, cuando se llama al constructor de la clase, el puntero a la clase base ahora se convierte en el puntero this a la clase específica, por lo que se puede obtener la corrección confiando en este puntero La vtable realmente puede conectarse con el cuerpo de la función de esta manera Este es el principio básico de la unión dinámica y el polimorfismo.
Nota: Debemos distinguir entre funciones virtuales, funciones virtuales puras y herencia virtual. Tenga en cuenta el principio de realización de la función virtual, porque uno de los puntos de prueba importantes de la entrevista polimórfica de C ++, y la función virtual es la base del polimorfismo.

17. ¿Cuál es la diferencia entre lista vinculada y matriz?

La matriz y la lista vinculada son diferentes en los siguientes puntos:
(1) Forma de almacenamiento: la matriz es un espacio continuo, la longitud debe determinarse al declarar, la lista vinculada es un espacio dinámico discontinuo con longitud variable y cada nodo debe guardar adyacente Puntero al nodo.
(2) Búsqueda de datos: la búsqueda lineal de la matriz es rápida. La operación de búsqueda utiliza directamente la dirección de desplazamiento. La lista vinculada necesita recuperar los nodos en orden, lo cual es ineficiente.
(3) Inserción y eliminación de datos: la lista vinculada puede insertar y eliminar nodos rápidamente, mientras que la matriz Puede requerir una gran cantidad de movimiento de datos.
(4) Problema de fuera de límites: la lista vinculada no tiene problemas de fuera de límites. La matriz tiene un problema de fuera de límites.
Descripción: Al seleccionar la estructura de datos de una matriz o lista vinculada, debe elegir según las necesidades reales. La matriz es fácil de consultar, la lista vinculada es fácil de insertar y eliminar, la matriz ahorra espacio pero longitud Fijo, aunque la lista vinculada se hace más larga, ocupa más espacio de almacenamiento

18. Cómo invertir una lista enlazada individualmente

1. Algoritmo cíclico inverso de lista enlazada individualmente

  1. Hay dos tipos de listas enlazadas:
    • Nodo principal: el nodo principal almacena información de longitud y el siguiente nodo principal apunta al primer nodo real;
    • Sin el nodo principal, el nodo principal es el primer nodo;
    • El nodo principal se utiliza aquí. Lista vinculada de nodos;
  2. Se necesitan tres punteros para registrar el nodo actual (para la inversión), el nodo anterior y el siguiente nodo (para reenviar después de la inversión).
    El código es el siguiente:
    / *
    lista enlazada
    1. Nodo principal: la longitud de la lista enlazada (u otra información) se almacena en el encabezado, encabezado-> siguiente apunta al primer nodo real;
    2. Sin el nodo líder: el encabezado es el primer nodo real
    * /
    typedef struct Node
    { int data; Node * next; }; void reverseList (Node * head) { if ((head == NULL) || ((head-> next) == NULL)) return; // si Si el encabezado está vacío o el nodo del encabezado apunta a un nodo vacío (la longitud de la lista vinculada es 0), salga. Node * pre, * cur, * next; // cur registra la posición actual, pre registra la posición anterior, que es el valor de cur-> next; next registra la siguiente posición, cur no es igual a cur-> next cur = head después de la inversión -> next; pre = NULL; // Después de la reversión, el nodo principal se convierte en el nodo de la cola, y su siguiente es Null while (cur! = NULL) { next = cur-> next; // Ya no puedes usar cur- después de la reversión > siguiente, primero registre este nodo cur-> siguiente = pre; pre = cur; cur = siguiente;















    }
    head-> next = pre; // cur ya está vacío, por lo que pre es el nodo de cola. head-> next lo señala.
    volver;
    }

2. Algoritmo recursivo para invertir la lista enlazada individualmente El
código es el siguiente:
List * reverse (List * oldList, List * newHead = NULL)
{ List * next = oldList-> next; // Registrar la lista enlazada después del último giro oldList-> siguiente = newHead; // Insertar el nodo actual al principio de la lista enlazada después de voltear newHead = oldList; // Procesar recursivamente la lista enlazada restante return (next == NULL)? newHead: reverse (t, newHead); }




19. Describe brevemente las similitudes y diferencias entre colas y pilas.

La cola y la pila son estructuras de almacenamiento lineales, pero las operaciones de inserción y eliminación de datos son diferentes. La cola es el primero en entrar, el primero en salir y la pila es el último en entrar, primero en salir.
Nota: El área de la pila y el área del montón se distinguen entre sí. La secuencia de acceso del área del montón es arbitraria. El área de la pila es la última en entrar, primero en salir. El compilador asigna automáticamente la pila para almacenar valores de parámetros de función, valores de variables locales, etc. Su operación es similar a la pila en la estructura de datos. El montón generalmente es asignado y liberado por el programador, si el programador no libera , Cuando el programa finaliza, puede ser reciclado por el sistema operativo. El método de asignación es similar a la lista vinculada. Es diferente del montón y la pila de esta pregunta. La pila es solo una estructura de datos, y el área del montón y el área de la pila son áreas de almacenamiento de memoria diferentes en el programa.

Finalmente, deseo éxito a los entrevistados.
Inserte la descripción de la imagen aquí

Puede haber deficiencias en lo anterior, bienvenidos a señalar la discusión, amigos que se sienten bien esperan obtener su apoyo de reenvío y pueden continuar siguiéndome.
(Siga + mensaje privado: C ++, obtenga materiales de aprendizaje y videos)
Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/weixin_52622200/article/details/110281341
Recomendado
Clasificación