Si arr es una matriz de enteros, ¿por qué la expresión ar ++ no es legal?

Cuando crea una matriz, digamos de enteros, significa que crea un bloque en el que almacena 100 números. Básicamente es como si crearas 100 variables, solo que afortunadamente no necesitas nombrarlas todas. En cambio, el programa tomó un trozo de memoria de 100 enteros largos y decidió que arr es la dirección (más precisamente el puntero si conoce los punteros) al primero de ellos, gracias a que le permite referirse a cualquiera de ellos usando el nombre arr: arr [0] es el primer número, aquel cuya dirección se llamó arr, arr [1] es el siguiente: el programa sabe dónde está el número a qué dirección se llamó arr y toma el número al lado, etc.

Entonces, ¿qué significaría agregar uno a arr? Bueno, debería significar que obtienes la dirección del siguiente valor, es decir, la dirección de arr [1]. Y eso está perfectamente bien, puedes comprobar que a C ++ no le importará que agregues 1, o cualquier otro número, al arr. arr + 5 es una expresión válida, lo que significa que obtiene la dirección (puntero a) del elemento arr [5].

Creo que es muy probable que eso sea lo que querías preguntar de hecho. Pregunte por qué no puede agregar 1 a arr? Entonces, para eso, la respuesta es: “seguro, puedes”, pero ++ es algo más que simplemente sumar 1. No está sumando 1 a algún número, está _cambiando_ este número al aumentarlo en uno. Si creó un arreglo arr, está hecho, lo ha creado y tiene un arreglo llamado arr que comienza y termina en algún lugar específico. Intentar hacer arr ++ significaría que ahora quieres que la misma matriz comience en un lugar diferente, eso es lo que significa “arr” después de todo, ¿no? Es la dirección donde comienza la matriz, por lo que hacer arr ++ significaría que desea que comience en un lugar diferente. Sin embargo, puede hacer arr + 1, lo que significaría que arr todavía comenzará en el mismo lugar, pero que quien obtenga la dirección “arr + 1” y la interprete como una matriz pensará que su matriz comienza desde su segundo elemento (llamado arr [1]). Esto tiene mucho sentido, si tiene 100 números en una matriz, puede decirle a alguien que lo interprete como una matriz de 99 números que comienza en un lugar más, pero el hecho de que lo haya interpretado de esta manera no debería cambiar el hecho (lo que intenta do arr ++ hubiera cambiado) que la matriz “arr” todavía existe en el mismo lugar donde se creó.

Creo que la pregunta alude al hecho de que las matrices “decaen” en punteros cuando se usan como argumento para una función.

Considere el siguiente código:

#include
vacío foo (int arr [])
{
arr ++; std :: cout << arr [0] << "\ n";
}
int main ()
{
int arr [] = {10, 20, 30};
foo (arr);
}

Cuando se ejecuta este código, la salida es ” 20 “. Esto se debe a que la matriz arr “decae” en un puntero al primer elemento de la matriz cuando se pasa a la función foo . Entonces, el argumento para foo es realmente un puntero al primer elemento de la matriz; su tipo es realmente int * . Luego, la primera línea de la función foo incrementa arr , que en realidad es un puntero a un int, de modo que ahora apunta al segundo elemento de la matriz, lo que significa que arr[0] después de ese incremento es el elemento que originalmente llegó arr[1]

Pero tenga en cuenta que no puede decir arr++ dentro de la función main , porque realmente hay una matriz. El “decaimiento” de un puntero ocurre cuando arr se pasa como argumento a otra función.

[C ++] Una pregunta sobre matrices • / r / learnprogramming

¿Incrementar todos los elementos en esa matriz? Creo que puede sobrecargar el operador ++ para matrices enteras. No hay nada ilegal al respecto. Pero no esperes que C ++ haga eso por ti. No es el propósito de un lenguaje de programación.

Efecto secundario del operador de incremento? Por supuesto, habrá algunas complicaciones y compromisos, pero la razón básica es que aumentar la variedad de enteros no es algo que les resulte complicado.

Es solo que C ++ no viene con esa característica para la matriz de enteros. Querían tratar la variedad de personajes como un caso especial, si quisieran podrían haberlo hecho también.

Esto se debe básicamente a que las matrices en C o C ++ son equivalentes a los punteros y, como tal, cuando dice simplemente ‘arr’, apunta a la dirección de memoria base donde la matriz realmente reside en la memoria. Entonces, cuando realiza un ‘arr ++’, simplemente apuntará al siguiente elemento en la memoria, en lugar de incrementar los elementos de la matriz.

En caso de que desee incrementar los elementos de la matriz, deberá recorrerlos (básicamente a través de cada celda de memoria) e incrementar los valores. Entonces,

int arr [5];

int * p;

‘arr’ es básicamente equivalente a p ya que ambos apuntan a alguna dirección en la memoria, y

arr [i] es equivalente a * p, ya que ambos apuntan al valor contenido en alguna celda de memoria.

de acuerdo a su pregunta:

int arr [] = {1,3,4,5,6}; //formación

y tu dicho arr ++; / / esto está mal.

Tienes que usar el subíndice. es decir arr [0], arr [1]. Ahora aquí tienes un subíndice de increement.

para (int i = 0; i

{

arr [i]

i ++;

}

El operando de un operador de incremento o decremento de prefijo incorporado debe ser un valor l modificable (no constante) de tipo aritmético o puntero no booleano para completar el tipo de objeto

Los operandos no modificables (por ejemplo, el nombre de la matriz, el nombre de la función, el tipo aritmético const , etc.) no se pueden incrementar utilizando el objeto de puntero de incremento.

Considerando ar es un conjunto de enteros.

Lo que significa que ar es la dirección base de la matriz de enteros (es decir, & ar [0])

Considere un puntero p = ar; (p = & ar [0])

p ++, (p = p + 1) .. Pero esto es válido. Un puntero +1 hará que se mueva al siguiente en la matriz, por lo que p es ar [1]

Ahora, ¿por qué ar ++ sería ilegal?

Los punteros de matriz son punteros constantes, es decir, su dirección base no se puede cambiar.

Los punteros constantes funcionan de manera similar a otras constantes en c ++, considere const int x = 5; ,

no puede cambiar el valor de x, entonces x ++ es ilegal

similar en la matriz decir ar [100],

ar es una constante, es decir, su dirección base no se puede cambiar, por lo que ar ++ es ilegal