C Preguntas de la entrevista y respuestas (página -3)

 

Asignación de puntero y dinámico de memoria (DMA)

 

31) ¿Qué es una variable puntero?

 

Un puntero es una variable que contiene la dirección en la memoria de otra variable. Se necesita el mismo tamaño en la memoria para cualquier tipo de punteros.

 

El tamaño de la variable de puntero depende del compilador.

 

32) ¿Cuáles son las ventajas y desventajas del uso de punteros en C?

 

Ventajas:

 

    • Como sabemos una función puede return valor único, sino que utilizan punteros podemos return múltiples valores de las funciones.

 

    • En general declaramos memoria para las variables en el tiempo de compilación, pero hay un problema tampoco se necesita más memoria o que ocupamos el espacio de memoria adicional. El uso de los punteros podemos asignar memoria para la variable en tiempo de ejecución y, por supuesto, podemos cambiar su tamaño while tiempo de ejecución.

 

    • El uso de punteros podemos diseñar la estructura de datos compleja como la pila de espera, lista enlazada y Árbol etc.

 

    • En general, no podemos cambiar el valor de la variable en una función (llamada por valor), pero el uso de punteros (llamadas por referencia) podemos cambiar los valores reales de los parámetros.

 

    • y punteros permiten el acceso directo a la memoria.

 

 

Desventajas:

 

    • punteros permiten el acceso directo a la memoria, se puede acceder a posiciones de memoria protegidas.

 

    • If puntero no está inicializado, puede ser la causa del fallo de segmentación.

 

    • Estos son más lentos que otras variables simples.

 

    • punteros necesitan liberar memoria asignada dinámicamente.

 

 

33) ¿Qué es un puntero nulo?

 

Un puntero, que no apunta dirección de cualquier variable se denomina puntero NULL . En otras palabras, podemos decir que un puntero NULL es un puntero no inicializado, que pueden apuntar en cualquier lugar.

 

Por ejemplo: int * ptr; aquí, ptr es un puntero NULL , hasta entonces se inicializa con la dirección de cualquier variable. También podemos asignar a un puntero, como int * ptr = NULL;

 

34) ¿Cuál es void * (void puntero)?

 

void * es un tipo especial de puntero, apunta la dirección de memoria que no tiene el tipo de datos específico. Se utiliza cuando se desea punto (tienda) de direcciones de memoria del tipo de datos desconocido. Se puede acceder al valor a través de un void * después de la conversión de tipos.

 

    #include < stdio.h >
      int main()
      {
  	    int a=10;
  	    float b=1.23f;
  	    void* ptr;
  	    ptr=&a;
  	    printf("na=%d",*(int*)ptr);
  	    ptr=&b;
  	    printf("nb=%f",*(float*)ptr);
  	    return 0;
      }

 

salida

 

a=10
b=1.230000

 

35) ¿Cuál es la diferencia entre un puntero a NULL y macro NULL?

 

ambos son diferentes, sigue la declaración

 

#define NULL 0

 

Aquí, NULL es una macro, y será reemplazado por 0 while pre-procesamiento del código, no es nada más que un nombre de macro de valor 0.

 

While, NULL es un puntero que no existe ningún sitio puntos dirección de memoria es decir, que la dirección de la que lo hace.

 

36) Explicar el concepto de puntero colgando?

 

A colgando puntero surge cuando usamos la dirección de un objeto / variable después de su vida útil ha terminado, o un punto de puntero a la dirección desconocida.

 

Esto puede ocurrir está situado como volver dirección de la variable automática a partir de una función o utilizando el bloque de memoria después de que se libera.

 

Considere el siguiente ejemplo

 

    #include < stdio.h >
      char* displayText(void)
      {
  	    char text[]="c programming";
  	    return text;
      }
      int main()
      {
  	    printf("Text returned by function : %s", displayText());
  	    return 0;
      }

 

en el ejemplo anterior función será return valor de la basura, porque texto es una variable local en la función displayText y es visible y vivo para displayText.

 

37) ¿Qué es una variable volatile?

 

compilador optimiza las variables y lo almacena en los registros de acuerdo con las frecuentes usos, if valor real de un cambio de variable, no va a utilizar en la expresión, volatile palabra clave indica al compilador que el valor de la variable puede cambiar en cualquier momento, por lo que la variable (definido como volatile) no debe ser optimizado por el compilador.

 

variables deben ser accedidos de almacenamiento de la variable real para cada referencia, se utiliza generalmente con las variables y objetos que son compartidos entre los hilos, funciones y pueden cambiar en cualquier manejador de interrupciones o en los registros del dispositivo.

 

38) ¿Qué es un puntero genérico?

 

Un puntero declarado con el tipo void que se conoce como puntero genérico . ya que no hay ninguna variable de void escribir de manera void puntero no apunta a una variable específica. Puede ser utilizado para señalar cualquier tipo de variable (como int, char, float, struct) después de tipo fundido.

 

Ejemplo

 

    #include < stdio.h >
      int main()
      {
  	    void *ptr;
  	    int a=10;
  	    ptr= (int*) &a;
  	    printf("nValue of a : %d, Address : %08Xn",*(int*)ptr,(int*)ptr);
  	    return 0;
      }

 

salida

 

Value of a : 10, Address : 0000FFF4

 

39) ¿Qué es una cerca, de lejos y punteros grandes?

 

Antes de aprender acerca de estos punteros, usted debe saber acerca de los segmentos de memoria. El segmento de memoria es la división de la memoria del ordenador (primaria) en segmentos, secciones. Es un sistema para hacer frente a la memoria de un ordenador.

 

puntero cerca

 

Un puntero cerca tarda 2 bytes en la memoria y puede señalar segmento de datos de 64 KB. No puede acceder a los datos más allá del segmento de datos. Se puede declarar que con la ayuda de cerca de la palabra clave.

 

lejos del puntero

 

Un puntero ahora ocupa 4 bytes en la memoria y puede apuntar direcciones de memoria RAM enteros. El exterior de memoria del segmento default (datos) se puede acceder a / en punta por el puntero declara con lejos de palabras clave. Se puede acceder a todos los 16 segmentos.

puntero grande

 

Un puntero enorme ocupa 4 bytes en la memoria. Tiene un selector explícita, que es igual que el más puntero. La única diferencia es que, cuando se do cualquier aritmética de punteros, puede cambiar el selector. While lejos puntero puede cambiar sólo offset.

 

Ejemplo

 

    #include < stdio.h >
      int main()
      {
  	    int near *ptr;
  	    int far  *ptr1;
  	    int huge *ptr2;
  	    printf("n%d,%d,%d",sizeof(ptr),sizeof(ptr1),sizeof(ptr2));
  	    return 0;
      }

 

salida

 

2,4,4

 

40) ¿Cuál es indirecta en C, lo que operador se utiliza para direccionamiento indirecto y cuántos niveles de indirección se puede utilizar para una sola declaración?

 

variable A simple es la referencia directa a la memoria; se puede acceder directamente al valor de esa variable con fuera de eliminación de referencias o indirecta. Pero no son punteros, if que desea acceder el valor de cualquier dirección de memoria que tiene que utilizar puntero de indirección .

 

Indirección (desreferenciar) es el operador “*” , se utiliza porque puntero no tienen referencia directa a la memoria. Una variable puntero almacena la dirección de la variable. Para acceder al valor de esa dirección de memoria utilizando la variable puntero, usted tiene que utilizar * antes de la variable puntero.

 

Al menos 12 indirecciones son posibles para una sola declaración.

 

    #include < stdio.h >
      int main()
      {
          int num = 10;
          printf("nBefore indirection, value of num=%d",num);
          int *ptr1 = & num;
          int **ptr2 = & ptr1;
          int ***ptr3 = & ptr2;
          int ****ptr4 = & ptr3;
          int *****ptr5 = & ptr4;
          int ******ptr6 = & ptr5;
          int *******ptr7 = & ptr6;
          int ********ptr8 = & ptr7;
          int *********ptr9 = & ptr8;
          int **********ptr10 = & ptr9;
          int ***********ptr11 = & ptr10;
          int ************ptr12 = & ptr11;
          ************ptr12 = 20; 
          printf("nAfter indirection, value of num=%d",num);
          return 0;
      }

 

salida

 

    Before indirection, value of num=10
      After indirection, value of num=20

 

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *