2013-11-26 5 views
0

Я пытаюсь выучить указатели, которые являются реальной PITA, когда вы не совсем это понимаете.Цикл через массив с указателями?

Я пытаюсь напечатать все элементы в массиве, но напечатан только первый элемент.

#include <stdio.h> 

int count(const int* numbers, int size) 
{ 
    for(; numbers < size; numbers++) 
    { 
     printf("%d", *numbers); 
    } 
} 

int main(void) 
{ 

    int numbers[] = {3, 4, 6, 3, 46}; 

    int result = count(numbers, 5); 

    printf("%d\n", result); 

    return 0; 
} 

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

+0

Нет возвращаемого значения в функции count? – Joze

+0

Мой плохой. Я еще не добрался туда. Я сосредоточен на том, чтобы первый цикл работал. – user3032809

+0

Глупый вопрос (просто любопытно): вы используете архитектуру без архитектуры x86? – jcm

ответ

4

сравнение numbers < size неправильно.

У вас есть 3 варианта:

  1. имеют отдельную индексную переменную:

    int count; 
    for(count = 0; count < size; count++) 
    { 
        printf("%d", numbers[count]); 
    } 
    
  2. имеют отдельный "курсор" указатель:

    const int * const end = numbers + size; 
    for(; numbers < end; numbers++) 
    { 
        printf("%d", *numbers); 
    } 
    
  3. Декремент size:

    for(; size != 0; size--, numbers++) 
    { 
        printf("%d", *numbers); 
    } 
    
+0

Хорошо. Я бы сделал это 'int * const end = orig + size;', чтобы убедиться, что это тоже не случайно. – unwind

2

Поскольку числа являются указателем, он содержит адрес. size - int и равно 5. Адрес не 5, ни даже вблизи 5.

Вы можете сохранить начальный адрес и рассчитать смещение:

int count(const int* numbers, int size) 
{ 
    const int* start = numbers; 
    for(; (int)(numbers - start) < size; numbers++) 
    { 
    printf("%d\n", *numbers); 
    } 
} 
+0

Я действительно не понимаю, как 'const int * start = numbers;' отличается от 'numbers', так как они равны? : S Могу ли я не называть 'for (* numbers user3032809

+0

'numbers' - это адрес ячейки вашего массива,' * numbers' значение в ячейке, на которое указывает , 'size' - это, по-видимому, количество ячеек, которые у вас есть в вашем массиве, поэтому вам нужно знать, сколько ячеек вы напечатали. 'start' отличается от' number', поскольку ваш 'for' цикл выполняет' numbers ++ 'после каждой итерации. – Eregrith

+0

Это то же самое, что сказать «С 121 Смит-роуд, расскажи мне имена людей, живущих в 5 соседних домах». Вы не будете проверять адрес дома против 5, вы помните, что начали с 121 года, поэтому по прибытии в 127 вы сделаете расчет в своей голове (127-121 = 6) и поймете, что вы сделали 5 запросов потому что вы закончили – Eregrith

2

функция count() должна быть

int count(const int* numbers, int size) 
{ 
    for(; size > 0; numbers++, size--) 
    { 
     printf("%d", *numbers); 
    } 
} 
Смежные вопросы