Diferente forma de acceder a los elementos de la matriz en C

3 minutos de lectura

avatar de usuario
José

Soy asistente de enseñanza en un curso de programación en C y me encontré con la siguiente línea de código C:

char str[] = "My cat's name is Wiggles.";
printf("%c %c %c %c\n", str[5], *(str + 5), *(5 + str), 5[str]);

Nunca encontré el último argumento (5[str]) antes, y mi profesor tampoco. No creo que se mencione en K&R y C Primer Plus. Encontré este fragmento de código en un conjunto de preguntas de una entrevista técnica. ¿Alguien sabe por qué C también le permite acceder a un elemento de matriz de esa manera? Nunca escuché que un índice esté fuera del conjunto de corchetes y el nombre de una matriz dentro de los corchetes.

¡Su ayuda será muy apreciada!

  • Esta es una pregunta frecuente sobre muerte a golpes. c-faq.com/aryptr/joke.html. En realidad, el ejemplo que publicó en su pregunta ya contiene la respuesta.

    – Ant

    5 de abril de 2011 a las 1:14


  • Sí, la indexación de matrices es conmutativa. Raramente visto fuera de las entradas de IOCCC. Si se ve en el código de producción, dispara al autor a la vista.

    – Juan Bode

    5 de abril de 2011 a las 2:19

Perfectamente válido C. Desde Wikipedia:

De manera similar, dado que la expresión a[i] es semánticamente equivalente a *(a+i), que a su vez es equivalente a *(i+a), la expresión también se puede escribir como i[a] (aunque esta forma rara vez se usa).

Loco, pero válido.

Es básicamente la forma en que funciona C. str[5] es realmente equivalente a *(str + 5). Ya que str + 5 y 5 + str son iguales, esto quiere decir que también puedes hacer *(5 + str)o 5[str].

Ayuda si no piensa en “5” como un índice, sino que la suma en C es conmutativo.

str[5] se traduce directamente a *(str + 5)y 5[str] se traduce directamente a *(5 + str). Lo mismo =)

De manera similar, dado que la expresión a[i] es semánticamente equivalente a *(a+i), que a su vez es equivalente a *(i+a), la expresión también se puede escribir como i[a] (aunque esta forma rara vez se usa).

http://en.wikipedia.org/wiki/C_syntax#Accessing_elements

Es todo lo mismo. *ptr o ptr[0] en realidad significa *(ptr+0). Así que siempre que escribas *ptr o ptr[0] va como *(ptr+0). Digamos que quieres valor en ptr[4] entonces significa que también puede escribirlo como *(ptr+4). Ahora, ya sea que lo escriba como *(ptr+4) o *(4+ptr), es lo mismo. así que solo para entender si puedes escribir *(ptr+4) como ptr[4] de la misma manera *(4+ptr) es lo mismo que 4[ptr]. por favor pasa http://en.wikipedia.org/wiki/C_syntax#Accessing_elements para más detalles.

avatar de usuario
Arrendajo

si str es una matriz de tipo char, entonces podemos acceder a cualquier índice, digamos i, como se muestra a continuación:

  1. calle[i]
  2. *(str + i)
  3. char *p = str, luego acceda al índice i como p[i] o *(p+i)

avatar de usuario
逆さま

Es una sintaxis funky seguro, pero…

str[5] Significaría *(str+5)

Y

5[str] Significaría *(5+str)

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad