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:
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