2016-03-07 5 views
0

Итак, я начинаю с программированием и пониманием указателей C и как их использовать, все еще вызывает у меня проблемы. Здесь я просто пытаюсь выполнить итерацию по массиву с помощью указателя. У меня есть этот бит кода ниже, но вместо того, чтобы заканчиваться на 55, он печатает дополнительное значение (32765). Во-первых, может кто-нибудь объяснить мне, почему я получаю дополнительную ценность? Во-вторых, может ли кто-нибудь сказать мне, как ограничить эту программу значениями в массиве? Я попытался использовать * pntr < 5 для состояния, но затем ничего не печатает.Итерация через массив w/pointer

void iterate(int* li) { 

    for (int *pntr = li; *pntr; pntr++) { 
     printf("%d\n", *pntr); 
    } 
} 

int main(){ 

int values[] = {11, 22, 33, 44, 55}; 

iterate(values); 
} 
+1

Подумайте о том, что '* pntr' делает один раз' pntr' больше не указывает ни на одно из ваших значений. –

+1

Потому что вы вызываете неопределенное поведение. Нет необходимости, чтобы массив 'int' был завершен с нулевой точкой, поэтому ваше условие завершения цикла' for' не должно выполняться. –

ответ

3

Это правильный код

void walk(const int *arr, size_t n) 
{ 
    int *p; 

    for (p = arr; p < arr + n; ++p) 
     printf("%d\n", *p); 
} 

Это происходит потому, что arr + n получает адрес n целых чисел от базового адреса arr.

Кроме того, int массивы не имеют законных прав; только char массивы, когда они используются с кавычками. ("abc", а не {'a', 'b', 'c'}).

+0

Спасибо за ответ, это определенно прояснилось для меня. Большинство из того, что я смог найти при поиске в Google, было связано с массивами символов, поэтому я мог видеть, как я запутался здесь. – JIPtheVIP

+0

Если ответ вам помог, вы можете выбрать его как «принятый ответ», нажав галочку рядом с ответом – stackptr

1

Этот цикл for:

for (int *pntr = li; *pntr; pntr++) { 
    printf("%d\n", *pntr); 
} 

... ожидает, что массив будет нулем. Используя *pntr в качестве теста, вы проверяете, что значение, на которое указывает pntr, не равно нулю. Таким образом, если массив не заканчивается нулем, ваш цикл будет блуждать мимо конца массива до тех пор, пока он не достигнет нуля или не вызовет segfault.

0

Ваш код в целом неплохой, но отсутствует один из основных факторов: рабочее состояние окончания.

В вашем цикле for, когда вы пишете *pntr, конечное условие будет состоять в том, что цикл будет остановлен при достижении заданного значения 0. Но поскольку ваш массив содержит ненулевые значения, он получит один за пределами выделенной памяти для вашего массива.

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

Чтобы устранить недостающие конечные условия, у вас есть два решения: либо вы разделяете длину массива с помощью функции iterate, либо добавляете значение, которое, как известно, является конечным значением вашего массива.

Так что либо вы делаете:

void iterate(const int *arr, size_t n) { 
    for (it = arr; it < arr+n ; +=it) printf("$d\n", *it); 
} 

или вы можете сделать:

#define LAST_ITEM -1 

int values[] = {11, 22, 33, 44, 55, LAST_ITEM}; 

void iterate(const int *arr, size_t n) { 
    for (it = arr; *it != LAST_ITEM ; +=it) printf("$d\n", *it); 
} 

(вы можете использовать #define LAST_ITEM 0, до тех пор, пока вы используете значение, что это не может произойти в массиве) ,

Из этих двух решений лучше всего рассмотреть ваш массив с его размером.

Смежные вопросы