Preguntas de práctica sobre arrays

En este artículo, discutiremos algunos conceptos importantes relacionados con arrays y problemas basados ​​en eso. Antes de comprender esto, debe tener una idea básica sobre las arrays .

Tipo 1. Basado en la declaración de array:
estos son algunos puntos clave en la declaración de array:

  • Una array unidimensional se puede declarar como int a[10] o int a[] = {1, 2, 3, 4}. Significa que especificar el número de elementos es opcional en una array 1-D.
  • Una array bidimensional se puede declarar como int a[2][4] o int a[][4] = {1, 2, 3, 4, 5, 6, 7, 8}. Significa que especificar el número de filas es opcional pero las columnas son obligatorias.
  • La declaración de int a[4] dará los valores como basura si se imprime. Sin embargo, int a[4] = {1,1} inicializará los dos elementos restantes como 0.

Que – 1. Predecir la salida del siguiente programa

int main()
{
    int i;
    int arr[5] = {1};
    for (i = 0; i < 5; i++)
        printf("%d ", arr[i]);
    return 0;
}

(A) 1 seguido de cuatro valores basura:
(B) 1 0 0 0 0
(C) 1 1 1 1 1
(D) 0 0 0 0 0

Solución: como se discutió, si la array se inicializa con pocos elementos, los elementos restantes se inicializarán en 0. Por lo tanto, se imprimirá 1 seguido de 0, 0, 0, 0.

Que – 2. Prediga la salida del siguiente programa:

int main()
{
    int a[][] = {{1,2},{3,4}};
    int i, j;
    for (i = 0; i < 2; i++)
        for (j = 0; j < 2; j++)
            printf("%d ", a[i][j]);
    return 0;
}

(A) 1 2 3 4
(B) Error del compilador en la línea ” int a[][] = {{1,2},{3,4}};”
(C) 4 valores basura
(D) 4 3 2 1

Solución: como se discutió, es obligatorio especificar la cantidad de columnas en la array 2-D, por lo que dará un error de tiempo de compilación.

Tipo 2. Búsqueda de la dirección de un elemento con la dirección base dada:
cuando se declara una array, se le asigna un bloque contiguo de memoria que ayuda a encontrar la dirección de los elementos a partir de la dirección base.

Para una array unidimensional a[100], la dirección del i-ésimo elemento se puede encontrar como:

addr(a[i]) =  BA+ i*SIZE

Donde BA representa la dirección base (dirección del elemento 0) y SIZE representa el tamaño de cada elemento en la array.

Para una array bidimensional x[3][3], los elementos se pueden representar como:

55

Como la array 2-D se almacena en orden de fila principal en lenguaje C, la fila 0 se almacenará primero, seguida de la fila 1 y la fila 2. Para encontrar la dirección de x[2][2], debemos ir a la segunda fila ( cada fila tiene 3 elementos). Después de llegar a la segunda fila, se puede acceder a ella como una array unidimensional. Por lo tanto, debemos ir al segundo elemento de la array. Suponiendo que BA sea 0 y tamaño 1, la dirección de x[2][2] será 0 + (2 * 3 + 2) * 1 = 8.

Para una array dada con m filas y n columnas, la dirección se puede calcular como:

 add(a[i][j]) = BA + (i*n + j) * SIZE

Donde BA representa la dirección base (dirección del elemento 0), n representa el número de columnas en la array 2-D y SIZE representa el tamaño de cada elemento en la array.

Que – 3. Considere la siguiente declaración de un ‘arreglo bidimensional en C:

char a[100][100];

Suponiendo que la memoria principal es direccionable por bytes y que la array se almacena a partir de la dirección de memoria 0, la dirección de a[40][50] es: (GATE CS 2002)
(A) 4040
(B) 4050
(C) 5040
(C) 5050

Solución: Usando la fórmula discutida,

 addr[40][50] = 0 + (40*100 + 50) * 1 = 4050

Que – 4. Para un programa C que accede a X[i][j][k], un compilador genera el siguiente código intermedio. Suponga que el tamaño de un número entero es de 32 bits y el tamaño de un carácter es de 8 bits. (GATE-CS-2014)

t0 = i * 1024
t1= j * 32
t2 = k * 4
t3 =t1 + t0
t4 = t3 + t2
t5 = X[t4]

¿Cuál de las siguientes afirmaciones sobre el código fuente del programa C es correcta?
(A) X se declara como “int X[32][32][8]”
(B) X se declara como “int X[4][1024][32]”
(C) X se declara como “char X [4][32][8]”
(D) X se declara como “char X[32][16][2]”

Solución: Para un arreglo tridimensional X[10][20][30], tenemos 10 arrays bidimensionales de tamaño [20]*[30]. Por lo tanto, para una array tridimensional X[M][N][O], la dirección de X[i][j][k] se puede calcular como:

BA + (i*N*O+j*O+k)*SIZE

Dadas diferentes expresiones, el valor final de t5 se puede calcular como:

t5 = X[t4] = X[t3+t2] = X[t1+t0+t2] = X[i*1024+j*32+k*4]

Igualando direcciones,

(i*N*O+j*O+k)SIZE = i*1024+j*32+k*4 = (i*256+j*8+k)4

Comparando los valores de i, j y SIZE, obtenemos

SIZE = 4, N*O = 256 and O = 8, hence, N = 32

Como el tamaño es 4, la array será un número entero. La opción que coincide con el valor de N y O y la array como número entero es (A).

Tipo 3. Acceder a los elementos de la array usando punteros –

  • En una array unidimensional a[100], se puede acceder al elemento a[i] como a[i] o *(a+i) o *(i+a)
  • Se puede acceder a la dirección de a[i] como &a[i] o (a+i) o (i+a)
  • En el arreglo bidimensional a[100][100], se puede acceder al elemento a[i][j] como a[i][j] o *(*(a+i)+j) o *(a[i ]+j)
  • Se puede acceder a la dirección de a[i][j] como &a[i][j] o a[i]+jo *(a+i)+j
  • En una array bidimensional, se puede acceder a la dirección de la i-ésima fila como a[i] o *(a+i)

Que – 5. Suponga la siguiente declaración de variable C

int *A [10], B[10][10];  

De las siguientes expresiones

I. A[2]
II. A[2][3]
III. B[1]
IV. B[2][3]

que no dará errores en tiempo de compilación si se usa como lado izquierdo de las declaraciones de asignación en un programa C (GATE CS 2003)?
(A) Solo I, II y IV
(B) Solo II, III y IV
(C) Solo II y IV
(D) Solo IV

Solución: como se indica en la pregunta, A es una array de 10 punteros y B es una array bidimensional. Considerando esto, tomamos un ejemplo como:

int *A[10], B[10][10];
int C[] ={1, 2, 3, 4, 5};

Como A[2] representa un puntero de entero, puede almacenar la dirección de la array de enteros como: A[2] = C; por lo tanto, I es válido.

Como A[2] representa la dirección base de C, A[2][3] se puede modificar como: A[2][3] = *(C+3) = 0; cambiará el valor de C[3] a 0. Por lo tanto, II también es válido.

Como B es una array 2D, B[2][3] se puede modificar como: B[2][3] = 5; cambiará el valor de B[2][3] a 5. Por lo tanto, IV también es válido.

Como B es una array 2D, B[2] representa la dirección de la segunda fila que no se puede usar en LHS de la declaración ya que no es válido modificar la dirección. Por lo tanto, III no es válido.

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

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