Cómo acceder a cualquier nombre de variable según el índice de bucle

Tengo algunas variables enteras, las nombré n0 a n9 . Quiero acceder a ellos utilizando un bucle. Intenté este código para hacer eso:

 int n0 = 0, n1 = 0, n2 = 0, n3 = 0, n4 = 0; int n5 = 0, n6 = 0, n7 = 0, n8 = 0, n9 = 0; for(i = 0; i < 10; i++){ if(digit == 1){ n[i] = n[i] + 1; } } 

Sé que no es la forma correcta, pero no sé cómo hacerlo correctamente.

Respuesta simple: declare una matriz en su lugar, como int n[10] .


Respuesta avanzada: no parece ser el caso aquí, pero en el caso de que necesite usar nombres de variables individuales de elementos de matriz, por el motivo que sea, puede usar una unión:

 typedef union { struct { int n0; int n1; int n2; ... // and so on int n9; }; int array[10]; } my_array_t; 

En caso de que tenga un antiguo comstackdor de dinosaurios, declare la estructura con un nombre de variable como struct { ... } s;


Cómo utilizar el tipo anterior en un progtwig práctico y del mundo real:

  my_array_t arr = {0}; for(int i=0; i<10; i++) { arr.array[i] = i + 1; } // access array items by name: printf("n0 %d\n", arr.n0); // prints n0 1 printf("n1 %d\n", arr.n1); // prints n1 2 

O puedes inicializar los miembros por nombre:

  my_array_t arr = { .n0 = 1, .n1 = 2, ... }; 

Ejemplo tonto y artificial de cómo usar el tipo anterior para asignar valores a las variables sin usar la notación de matriz:

  my_array_t arr = {0}; // BAD CODE, do not do things like this in the real world: // we can't use int* because that would violate the aliasing rule, therefore: char* dodge_strict_aliasing = (void*)&arr; // ensure no struct padding: static_assert(sizeof(my_array_t) == sizeof(int[10]), "bleh"); for(int i=0; i<10; i++) { *((int*)dodge_strict_aliasing) = i + 1; dodge_strict_aliasing += sizeof(int); } printf("n0 %d\n", arr.n0); // prints n0 1 printf("n1 %d\n", arr.n1); // prints n1 2 for(int i=0; i<10; i++) { printf("%d ",arr.array[i]); // prints 1 2 3 4 5 6 7 8 9 10 } 

La forma correcta de hacerlo es declarar una matriz de enteros y no 10 variables diferentes:

 int n[10]; 

Ahora puede acceder a 10 variables int con n[0] a n[9] .

Es casi imposible acceder a sus variables como lo desea, sin ningún tipo de matriz.

Todo lo que me viene a la mente es considerar 10 casos separados para cada variable, así que:

 int i; int n0, n2, n3 ... n9; for(i=0; i<10; i++) { switch(i) { case 0: n0++; break; case 1: ... } } 

Ya que no puedes usar arreglos “reales”, en vez de eso, usemos algo de memoria dinámica (realmente tonto pero …):

 #define NUMVALS 10 int main(int argc, char *argv[]) { int *values, *ptr, i; ptr = values = malloc(sizeof(int) * NUMVALS); for (i = 0; i < NUMVALS; i++) { ptr++ = 0; /* Set the values here or do what you want */ /* Ofc values[i] would work but looks like array access... */ } ... } 

Si realmente tiene varias variables a las que desea acceder como usted dice, guarde los punteros en una matriz (o como arriba) y acceda a ellas de esa manera, pero aún no es por nombre. Si debe acceder a ellos bien por su nombre, creo que queda con el preprocesador. No conozco ninguna otra forma adecuada de hacerlo.

 int n[10] = {0}; /*or you can initilize like this also , this will make all the elements 0 in array*/ for(i = 0; i < 10; i++){ if(digit == 1){ n[i] = n[i] + 1; } } 

Intenta eso y dejame saber