pointer new functions create array c arrays pointers terminology

new - ¿Cuál es un término moderno para "equivalencia matriz/puntero"?



pointers in c (10)

Casi todos los que leen esto probablemente estén familiarizados con estos tres hechos clave sobre C:

  1. Cuando menciona el nombre de una matriz en una expresión, evalúa (la mayoría de las veces) a un puntero al primer elemento de la matriz.
  2. El operador "array subscripting" [] funciona igual de bien para los punteros que para las matrices.
  3. Un parámetro de función que parece ser una matriz realmente declara un puntero.

Estos tres hechos son absolutamente fundamentales para el manejo de matrices y apuntadores en C. No son ni siquiera tres hechos separados; son facetas interrelacionadas de un concepto central. No es posible hacer una programación de C bastante básica sin una comprensión decente de este concepto.

Mi pregunta de hoy es sencilla: ¿Cuál es el nombre de este concepto?

Supongo que estoy pasado de moda, pero siempre lo llamé "La equivalencia entre arrays y punteros en C", o "matriz / puntero de equivalencia" para abreviar. Pero aprendí que casi no puedes decir esas palabras en SO; son bastante tabú.

Esto puede parecer una pregunta abstracta o filosófica, así que para enmarcarlo de manera más concreta, lo que estoy buscando es un sustantivo simple o una frase sustantiva que pueda usar en la oración "Sí, debido a _____, se puede pensar en el uso de subíndices de matriz como azúcar sintáctico para la aritmética del puntero ", en respuesta a, por ejemplo, esta pregunta .

(Pero tenga en cuenta que no estoy buscando respuestas a esa pregunta, ni respuestas a la pregunta "¿Qué le pasa a la palabra ''equivalencia''?". Sí, lo sé, puede inducir a error a los estudiantes a imaginar que los arreglos y punteros son de alguna manera Lo mismo. Tuve esa confusión en mente cuando escribí esta entrada en la lista de preguntas frecuentes .


  1. El operador "array subscripting" [] funciona igual de bien para los punteros que para las matrices.

No, de hecho solo funciona para punteros. Siempre que escriba [] en una expresión, siempre obtendrá un puntero al primer elemento. Esto está garantizado para suceder ya que arr[i] debe ser equivalente a *(arr + i) . El primero es "azúcar sintáctico" para este último.

  1. Un parámetro de función que parece ser una matriz realmente declara un puntero.

Este es en realidad un caso especial, denominado "ajuste de matriz", donde el compilador cambia implícitamente la declaración de un parámetro de función del tipo de matriz en un puntero al primer elemento. La razón fundamental es sin duda hacer que las funciones sean compatibles con la "disminución de matriz" de expresiones, pero el estándar C mantiene los términos separados.

Ambos casos, expresiones y parámetros de funciones, a menudo se denominan informalmente "decaimiento de matriz". Aunque a veces esto solo se usa para expresiones y no para parámetros de funciones. No creo que exista un uso único y consistente del término. La "decadencia de matriz" es la mejor, creo, aunque el estándar C no usa ese término en ninguna parte.

(No me gusta el término "equivalencia", porque una matriz puede convertirse en un puntero, pero no al revés. De hecho, siempre hay un sinnúmero de principiantes con creencias confusas como "arreglos y punteros son lo mismo". Llamarlos " equivalente "no ayuda exactamente")


Esto puede parecer una pregunta abstracta o filosófica, así que para enmarcarlo más concretamente, lo que estoy buscando es un sustantivo simple o una frase nominal. Podría usar la oración "Sí, debido a _____, la suscripción a un conjunto puede considerarse como azúcar sintáctico para la aritmética del puntero ", en respuesta a, por ejemplo, esta pregunta.

La frase que está buscando es "Sí, debido a que la suscripción de matriz es aritmética de puntero bajo el capó, la suscripción a matriz puede considerarse azúcar sintáctica para la aritmética de puntero".

Lo cual es por supuesto, tonto, porque la razón para decir que la matriz de suscripción es azúcar sintáctica para la aritmética del puntero es porque eso es exactamente lo que es, no requiere más explicación a menos que la persona a la que le dices esto no sepa qué significa suscribir '','' aritmética de puntero ''o'' azúcar sintáctico ''. Esto no quiere decir que el compilador no sepa la diferencia de los dos (lo hace porque es el responsable de todo el azúcar sintáctico que obtiene como resultado de eso).

Esta misma pregunta podría plantearse sobre todo lo que cualquier idioma hace por nosotros, lo que podríamos hacer nosotros mismos mediante el uso de un mayor número de instrucciones de nivel inferior y, como tal, poder referirnos a él utilizando múltiples términos que solo cambian la cantidad de azúcar sintáctica utilizada. El objetivo no es pretender que son diferentes (siempre están en camino, pero ese no es el punto), sino facilitar la programación (basta pensar en escribir código sin tener el operador [] como azúcar sintáctico para la aritmética de puntero, y rápidamente te das cuenta de la razón de su existencia, no es porque sea diferente , es porque es más fácil escribir, leer y administrar).

(Pero tenga en cuenta que no estoy buscando respuestas a esa pregunta, ni respuestas a la pregunta "¿Qué le pasa a la palabra ''equivalencia''?". Sí, lo sé, puede inducir a error a los estudiantes a imaginar que los arreglos y punteros son de alguna manera lo mismo. Lo tenía en mente cuando escribí esta entrada en la lista de preguntas frecuentes.)

Su pregunta parece ser "¿Cuál es un término moderno para la equivalencia del puntero matriz en el sentido de que la suscripción al conjunto es solo azúcar sintáctica para la aritmética del puntero?"

La respuesta es:

  1. "Suscripción de matriz" cuando está utilizando el operador [] para indexar una matriz.
  2. "Aritmética del puntero" cuando mueve manualmente un puntero (en lugar de usar el operador []). También puede utilizar este término para cualquier operación matemática que esté haciendo con el valor que le da al operador [], pero en realidad no está haciendo aritmética de puntero, sino "calcular un índice", que es el término para la sintaxis. azúcar de tener el tamaño de los objetos en la memoria tomados en cuenta automáticamente para usted (que una vez más, no es diferente, simplemente más fácil de escribir, leer y administrar, por lo tanto: azúcar sintáctica).

El estándar C no tiene una sola palabra para esto. Utiliza la palabra "conversión" al definir el comportamiento (1) en 6.3.2.1p3, "equivalente" al definir el comportamiento (2) en 6.5.2.1p2 y "ajuste" al definir el comportamiento (3) en 6.7.6.3p7.

Estoy pasado de moda, y no creo que haya nada de malo en llamar a esta "equivalencia matriz / puntero", siempre que esté claro en contexto que estás hablando de expresiones donde (1) sucede o declaraciones de funciones donde (3) sucede. Sin embargo, un término más aceptable para las personas que no les gusta la "equivalencia" sería quizás la "conversión de matriz a punta", ya que esto confunde a las personas con mayor frecuencia cuando es (1), creo.


Estándar usa el término convertido a . La equivalencia de matrices y punteros aún se mantiene mejor sobre la desintegración de la matriz a los punteros . Estándar mencione este término en cualquier lugar, pero es solo un entendimiento mutuo entre los programadores que cuando se trata del contexto de matrices y punteros, se considera matriz y equivalencia de puntero. Y lo que significa puntero y matriz equivalencia es: la aritmética de puntero y la indexación de matriz [que] son ​​equivalentes en C, los punteros y las matrices son diferentes. .


Esta es una pregunta sutil. Al navegar por un diccionario y diccionario de sinónimos en inglés, descubrí que el término similitud podría ser apropiado para su contexto.

Según la definición del diccionario en línea de Oxford, la palabra Similar se define como:

tener un parecido en apariencia, carácter o cantidad, sin ser idéntico.

y la palabra Similitude como:

la calidad o el estado de ser similar a algo.

Como las matrices y punteros no son idénticos, pero a veces se tratan de manera similar, podríamos decir:

Sí, debido a la similitud de Array / Pointer, la subscripción de matriz se puede considerar como azúcar sintáctica para la aritmética del puntero ".


Gracias a todos. Estoy usando esta "respuesta" para resumir las respuestas dadas por las personas y mi evaluación de ellas, no como una respuesta adecuada, espero que nadie vote o algo por el estilo.

Mucha gente piensa seriamente en esta cuestión, y lo valoro. Pero en este punto, lo único que puedo concluir es que no hay respuesta, al menos hoy, a la pregunta que tenía en mente.

Muy pocas personas sugirieron "decaimiento de matriz", y esa es una muy buena toma, pero no funciona para mí. Se refiere principalmente al hecho 1 y tal vez al hecho 3 como se enumera en la pregunta original, pero no al hecho 2. No se puede decir "Sí, debido a la descomposición de la matriz, la subscripción de matriz puede considerarse azúcar sintáctica para la aritmética del puntero". (O al menos, no puede decir eso si su intención es clara e instructiva). Tendría que decir algo como "Sí, debido a la disminución de la matriz y la forma en que se define la aritmética del puntero para que sea coherente con esto, la subscripción de matriz se puede considerar como azúcar sintáctico para la aritmética del puntero ", que es, bueno, una olla de pescado diferente por completo.

Aunque no lo dije explícitamente, estaba buscando un término en uso común, generalizado y aceptado, aunque no había ningún requisito de que implique palabras realmente usadas en el Estándar. Y dado que nadie tosió tal término, dado que todos participaron en una cierta cantidad de especulación y "¿Qué pasa con ...?", Llegué a la conclusión de que no hay un solo término en uso generalizado para el concepto detrás del trío de relacionados hechos. (Aparte de "equivalencia", que se descarta).

Un número de contestadores y comentaristas dijeron esto (que no hay una respuesta) de varias maneras. Voy a seguir adelante y aceptar la respuesta de Lundin sobre esa base, y porque a otros parece haberles gustado lo mejor.

Yo, en adelante, podría intentar usar "La correspondencia entre matrices y punteros en C" y ver si capta. Las matrices y punteros son tan diferentes como los hombres y las mujeres, y en realidad están bastante separados, pero intercambian letras con frecuencia. :-)


Me gustaría ir con el término de decaimiento de matriz . Este término va bien con lo que sugiere. El estándar C no dice al respecto en este contexto y sí, el primer día que escuché el término fui a buscarlo en el estándar, pero no pude encontrarlo (así que es un poco confuso con respecto a quién acuñó el término, etc.). Además, alternativamente, uno puede escribir debido a que "la mayoría de los escenarios se convierten en un puntero" ... - No, esto no es un solo Sustantivo. Pero esto no deja lugar a interpretaciones erróneas. El estándar en sí mismo lo dice la "conversión".

La mayoría de las veces trato de decirlo todo el tiempo y luego pongo la palabra ("array decaying") entre corchetes. De hecho, hay respuestas en las que ni siquiera lo mencioné y seguí las palabras de conversión de la norma en puntero .


No se da un nombre único a los tres conceptos mencionados, pero creo que describirlos como implicando cualquier tipo de "equivalencia" es contraproducente, al menos cuando se describe el C. "moderno". Aunque los resultados de la decadencia del array generalmente se comportan como indicadores, C99 especifica que no es necesario que los punteros generados por la disminución de la matriz se comporten del mismo modo que los punteros conseguidos por otros medios. Dado:

char fetch_byte_at(void *p, int x) { return ((char*)p)[x]; } struct {char arr[5][7];} s; char test1(int x) { return s.arr[0][x]; } char test2(int x) { return fetch_byte_at(&s, x); }

el Estándar no especifica directamente ninguna razón por la cual el valor del puntero s.arr[0] utilizado en test1 no debe ser equivalente al valor del puntero ((char*)(void*)s) utilizado cuando se llama a fetch_byte_at desde test2 . Sin embargo, implica simultáneamente que test2 debería ser capaz de leer todos los bytes de s [lo que implica que debe funcionar de manera predecible con valores de x hasta al menos 34], mientras que decir que en s.arr[0][x] es solo significativo para valores de x hasta 6.

Si bien nada en el Estándar contradeciría ninguno de sus dos primeros puntos individualmente, no es posible que ambos lo tengan. O bien el resultado de una disminución de matriz es algo más que un puntero "ordinario" para el primer elemento de la matriz, o la aplicación del operador [] a una matriz tiene una semántica diferente de la aplicación a un puntero. Si bien no está claro cuál de los números 1 y 2 ha sido invalidado por C99, ya no forman ningún tipo de "equivalencia" en la C. moderna.

Si reconoce una distinción entre C tradicional y C "moderna", podría ser útil establecer términos para las cosas que hacen útil a la primera. Tales cosas van más allá de los puntos que mencionas, sin embargo. Desafortunadamente, no conozco ningún término estándar para tales cosas, y no buscaría que el Estándar brinde dicha terminología cuando ya no soporte los conceptos involucrados.


Si se refiere a una conversión de tipo, ¿por qué no utiliza el término '' casting ''? Ya se entiende comúnmente que implica que el compilador está siendo forzado a tratar dos tipos relacionados pero no iguales, como si fueran del tipo deseado. Sí, aquí hay una equivalencia, pero se usa ''casting'' para indicar que los tipos no son literalmente iguales, pero que el compilador debe tratar un tipo como un tipo diferente y que el procedimiento es aceptable para el compilador, como up-casting para byte-> long

Segunda opción: "Sinónimo"


Sugiero que "decaimiento de matriz a puntero" es una abreviatura razonable, ya que "decadencia" es una jerga común al referirse a la conversión de tipo, con precedente en otras partes de las preguntas más frecuentes de C: Pregunta 6.12 :

P: Como las matrices hacen referencia a la descomposición en punteros, si arr es una matriz, ¿cuál es la diferencia entre arr y & arr?

Un significado técnico extendido de "decaimiento" que incluye este ha sido adoptado en la nomenclatura de la biblioteca estándar de C ++ desde C ++ 11: std::decay