Как получить доступ к любому имени переменной в соответствии с индексом цикла

У меня есть целочисленные переменные, я назвал их n0 n9 . Я хочу получить к ним доступ, используя цикл. Я пробовал этот код:

 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; } } 

Я знаю, что это не так, но я не знаю, как это сделать правильно.

Простой ответ: объявите массив вместо него, как int n[10] .


Расширенный ответ: здесь, похоже, не так, но в случае, когда вам нужно использовать отдельные имена переменных элементов массива, по какой-либо причине вы можете использовать объединение:

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

Если у вас есть старый компилятор динозавров, тогда объявите структуру с именем переменной, например struct { ... } s;


Как использовать вышеуказанный тип в практической, реальной программе:

  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 

Или вы можете инициализировать участников по имени:

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

Глупый, искусственный пример использования вышеупомянутого типа для назначения значений переменным без использования обозначения массива:

  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 } 

Правильный способ сделать это – объявить целочисленный массив, а не 10 различных переменных:

 int n[10]; 

Теперь вы можете получить доступ к 10 переменным int с n[0] до n[9] .

Доступ к вашим переменным практически невозможен, как и вы, без какого-либо массива.

Все, что приходит мне на ум, состоит в том, чтобы рассмотреть 10 отдельных случаев для каждой переменной, так что:

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

Поскольку вы не можете использовать «реальные» массивы, вместо этого вместо этого используйте некоторую динамическую память (действительно глупо, но …):

 #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... */ } ... } 

Если у вас действительно есть несколько переменных, к которым вы хотите получить доступ, как вы говорите, хорошо сохраните указатели на них в массиве (или, как указано выше), и получите доступ к ним таким образом, но он по-прежнему не по имени. Если вы должны получить к ним доступ по имени, я думаю, что вы останетесь с предварительным процессором. Я не знаю другого подходящего способа сделать это.

 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; } } 

Попробуйте это и дайте мне знать