Test cuestionario sobre punteros en C - the question form
Preguntas: 16 · 10 minutos
1. Si p es de tipo int *, ¿qué instrucción asigna, de manera idiomática, espacio suficiente para cinco elementos int?
Ajustar según el tipo al que apunta: p = malloc(5 * sizeof *p);
Solicitar solo cinco bytes: p = malloc(5);
Usar el tamaño del puntero: p = malloc(sizeof p);
Usar cinco veces el tamaño de una dirección de puntero: p = malloc(5 * sizeof &p);
2. Dada la declaración int n;, ¿qué operación obtiene la dirección de memoria de n?
Desreferenciar n con *n
Aplicar la notación de arreglo con n[]
Medir el objeto mediante sizeof n
Aplicar el operador de dirección como &n
3. Una función está declarada como void swap(int *x, int *y);. ¿Qué llamada le permite intercambiar los valores de las variables int a y b?
Usar swap(*a, *b), intentando desreferenciar los enteros
Usar swap(a, b), pasando directamente los valores enteros
Usar swap(&a, &b), pasando las direcciones de ambas variables
Usar swap(&a, b), pasando una dirección y un valor
4. Supón que int *p apunta a n y que void reset(int **slot) asigna NULL a *slot. ¿Qué llamada permite que reset cambie el propio p?
Llamar a reset(p), pasando la dirección almacenada en p
Llamar a reset(*p), pasando el entero al que se accede mediante p
Llamar a reset(&p), pasando la dirección de la variable puntero
Llamar a reset(&n), pasando la dirección del entero
5. ¿Qué afirmación describe correctamente un puntero nulo?
Siempre apunta a una ubicación de memoria que contiene el entero cero.
No apunta a ningún objeto; se puede comparar con NULL, pero no se debe desreferenciar.
Apunta al primer elemento de un arreglo vacío.
Se puede desreferenciar de forma segura, pero su valor almacenado no puede cambiarse.
6. Para int a[6];, ¿cuál es el resultado de &a[4] - &a[1]?
La dirección de a[3]
El tamaño de tres objetos int en bytes
4
3
7. Dadas struct Node { int value; struct Node *next; }; y struct Node *cur;, ¿cómo debe actualizarse cur para que apunte al nodo siguiente?
Asignar el miembro next mediante el puntero: cur = cur->next;
Desreferenciar antes de aplicar una forma de acceso a miembro no válida: cur = *cur.next;
Usar en el puntero la sintaxis de acceso directo a miembros de una estructura: cur = cur.next;
Almacenar la dirección de la propia variable puntero: cur = &cur;
8. En un programa en C que necesita que p almacene la dirección de un int, ¿cuál declaración es correcta?
Usar la declaración de puntero int *p;
Declarar un entero común con int p;
Usar la sintaxis de referencia de C++ int &p;
Colocar el asterisco después del nombre, como en int p*;
9. ¿Qué permite la declaración const int *p;?
Cambiar mediante p el int al que apunta, pero no redirigir p
Ni redirigir p ni cambiar por ningún medio el int al que apunta
Redirigir p e impedir la modificación mediante p del int al que apunta
Almacenar únicamente un valor de puntero nulo en p
10. Considera int n = 12; int *p = &n;. ¿Cómo se puede leer el valor 12 a través de p?
Usar p directamente para obtener la dirección almacenada
Usar &p para obtener la dirección del puntero
Desreferenciar el puntero con *p
Intentar desreferenciar el entero con *n
11. Considera int n = 25; void *vp = &n;. ¿Qué expresión lee correctamente n a través de vp?
Convertir vp a int * y desreferenciarlo con *(int *)vp
Convertir directamente el valor del puntero a int con (int)vp
Desreferenciar directamente el puntero void con *vp
Obtener la dirección de la variable de puntero void con &vp
12. Dado int a[] = {10, 20, 30, 40}; int *p = a;, ¿a qué se evalúa *(p + 2)?
20
30
La dirección de a[2]
Una ubicación situada dos bytes después de a[0]
13. Después de llamar a free(p) sobre un bloque asignado correctamente, ¿qué opción describe mejor a p si no se le ha reasignado un valor?
Se convierte automáticamente en NULL.
Es un puntero colgante cuya dirección almacenada no se debe desreferenciar.
Sigue siendo válido hasta que termine la función actual.
Apunta a un nuevo bloque inicializado con ceros.
14. ¿Qué devuelve second(values) aquí? int second(const int *p) { return p[1]; } int values[] = {3, 7, 11};
3
La dirección de values[1]
11
7
15. ¿Cuál es el valor de n después de ejecutar este código? int n = 4; int *p = &n; *p = 9;
4
La dirección almacenada en p
n no cambia porque solo cambia p
9
16. Se declara un puntero local como int *p; y no se inicializa. ¿Qué debe hacer el programa antes de usar *p?
Desreferenciar p una vez para que C pueda determinar a qué apunta
Asignar a p una dirección válida antes de desreferenciarlo
Llamar a free(p) para inicializarlo como puntero nulo
Suponer que p apunta a un entero inicializado en cero