La eliminación de los primeros X de los elementos de la matriz

Tengo una matriz denominada matriz de tamaño 1024. Así que, básicamente, quiero eliminar la 1ª X de los elementos de la matriz. Cómo iba yo a hacer eso? Esto es lo que pienso:
Hacer que un puntero que apunta a la 1ª valor de la matriz (arr[0]). Hacer aritmética de punteros para llevarlo a la X-esima elemento de la matriz. A continuación, establezca el arr[0] para el puntero p, que efectivamente va a quitar el primer X elementos? En este trabajo?
O hay una manera más fácil de quitar la primera X de los elementos de la matriz?

  • Cómo es la matriz asignada?
  • Cómo es la matriz asignado (pila o montón)?
  • Ha sido más rápido por 10 segundos. Esto debe ser porque he escrito más de 10 caracteres 🙂
  • ¿Qué significa eliminar? ¿Significa esto que sólo quiero ser capaz de recorrer más de ella, omitiendo la primera X elementos? Si es asignado en la pila, no creo que usted puede cambiar su tamaño, necesita crear otra matriz o asignar un tamaño adecuado bloque de memoria.
  • ¿Qué es p que usted mencionó?
  • La matriz es una cadena global. Se inicializa usando: char arr[1024]
  • Sí, yo sólo quiero saltar sobre el primer elemento X, así que la próxima vez arr[0] se llama, devuelve el valor de arr[X].
  • Si usted ha usado malloc para la matriz && si tienes que «compartir» a la matriz original del puntero con alguien, entonces usted necesita tener cuidado al cambiar la matriz de ubicación de inicio. Así, se puede aclarar si este puntero es malloc ed y o compartida? Es toda matriz de indización se realiza mediante la obtención de la partida matriz de la dirección y la adición de un desplazamiento a ella? Además, cuando se cambia la matriz de localización, ¿tiene que liberar la memoria antigua, la vuelta al sistema (no es posible en una pila allocn)?
  • Esto no es malloc ed. Todos los de la matriz de la indización se realiza mediante la adición de un desplazamiento a ella sí. No estoy buscando para hacer cualquier asignaciones de memoria, ya que no está permitido todavía.

InformationsquelleAutor nonion | 2013-07-13

6 Kommentare

  1. 4

    Desde la matriz global que existirá en la memoria hasta que el programa termina. Pero esto no hará que deje de declarar un puntero que apunta a uno de sus elementos internos, y utilizar este puntero como el inicio de su matriz. Con sus notaciones: char* p = arr + X; de Esta manera p[0] será igual a arr[X], p[1] a arr[X + 1], y así sucesivamente.

    • Sí, esto es exactamente lo que estoy tratando de hacer. Traté de hacer *p = arr, entonces p++ hasta que llega a la Décima de punto. Pero después de esto estoy atascado en cómo voy a establecer arr[0] para ser el p
    • usted no puede fijar arr a ser p, sólo tiene que utilizar p en lugar de arr en el resto de su código. Por cierto, usted no necesita hacer p++ X veces – solo hacer p=arr+X;
    • Hacer esto: char* p = arr + X; de Esta forma p[0] será igual a arr[X].
    • Ah yo estaba pensando en hacer esto. Acabo de hacer modificaciones a la función para utilizar el punto p en lugar de utilizar la matriz directamente. Gracias!!
    • Usted es bienvenido 🙂
    • ya que parece estar en la escuela y haciendo un poco de trabajo, sospecho que hay más a lo que están pidiendo. retirar el búfer circular respuesta – creo que será lo que eventualmente necesitará.

  2. 3

    echa un vistazo a la función memmove, si puede. Esta es una gran manera para mover un bloque de memoria rápidamente.

    • Yo no puede utilizar esta función :\ asignación de Memoria/edición aún no está enseñado en mi clase. Esta es sólo una pequeña parte de mi asignación que estoy atascado en.
  3. 2

    Puede tratar arr como un buffer circular. Sin embargo, usted no puede acceder a ella como una matriz regular nada más. Usted necesita una interfaz.

    char arr[1024];
    int pos = 0;
    int size = 0;
    
    #define arr(i) arr[(pos+(i))%1024]
    
    void append (char v) {
        arr(size++) = v;
    }
    
    void remove_first_x (int x) {
        pos = (pos + x) % 1024;
        size -= x;
    }
    • este 012345
  4. 1

    Si arr se declara como char arr[1024];, entonces usted no puede.

    Si arr se declara como char * arr = (char *)malloc(1024 * sizeof(char)); a continuación: arr += 3

    O declarar como char do_not_use_this_name[1024];, a continuación, utilizar char * arr = do_not_use_this_name + 3;

    • ¿Cuál es la necesidad de fundición malloc aquí, su tipo de retorno será automáticamente convertida a arr‘s tipo de
    • no estoy seguro. en cierto modo me recuerda C que se utiliza para requerir un yeso, pero en estos días seguro que no. puede ser de la vieja escuela cosa?
    • sí , malloc no requiere . no es un error, aunque. malloc , básicamente, devuelve un puntero nulo, de manera que cuando asigna…. su regreso se convierte del tipo de variable.
  5. 1

    Puede mover el puntero X unidades y tratar de que como el inicio de la matriz:

    int arr[1024]; //could be other type as well
    
    ...
    
    int *p = arr;
    ...
    
    p += X; //x is the number of units you want to move
  6. 0

    Basado en su requisito de no usar memmove y a causa arr[0] para devolver el resultado de arr[x], se podría hacer algo como esto:

    char arr[1024];
    int arr_size = sizeof(arr) / sizeof(*arr);
    char* source;
    char* destination;
    char* arr_end = arr + arr_size;
    
    //Initialise the array contents
    
    for (destination = arr, source = arr + x; source < arr_end; ++source, ++destination)
        *destination = *source;

    Tenga en cuenta que esto es sólo cambio el contenido de la matriz inversa mediante la X. el tamaño de La matriz es todavía 1024.

    Tenga en cuenta que esto no va a hacer nada con el resto de los X elementos en la final de la matriz. Si desea cero de ellos, que posteriormente podría hacer algo como esto:

    for (; destination < arr_end; ++destination)
        *destination = 0;
    • Creo que he resuelto el problema por sólo nombrar a un punto de la matriz, entonces, para el resto de mi código, utilice el puntero en lugar de la matriz directamente. sin embargo, voy a probar con este código que has publicado anteriormente y si funciona mejor que el puntero de la solución que yo tengo, voy a usar el suyo. Gracias por la ayuda.
    • Solo he usado esta aplicación porque de mi entendimiento de sus requisitos. En general, yo recomiendo el uso de aritmética de punteros porque es más simple y más eficiente.

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea