2014-11-22 3 views
0

Привет, ребята у меня есть вопрос,печати массив из указателей

У меня есть массив с 10 элементами и функцией, которая возвращает меня указатель на случайно выбранный элемент в массиве. Теперь я хочу напечатать массив из этого элемента, на который указывает указатель, как я могу это сделать.

Пример: Массив: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 указатель указывает на элемент 6. Я хочу напечатать: 6, 7, 8, 9, 10

код выглядит в C:

int* randomElement(int* array, int size) { 
    int* pointer = NULL; 
    int randomNumber = 0; 
    randomNumber = rand() % size; 
    *pointer = *(array + randomNumber); 
    return pointer; 
} 

int main(void) { 
    int size = 10; 
    int array[size]; 
    int* pointer = NULL; 

    srand(time(NULL)); 

    pointer = randomElement(array, size); 
    /* Want to print the array from this element here */ 

    return EXIT_SUCCESS; 
} 
+0

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

+0

'* pointer = * (array + randomNumber)' is очень плохо в этом контексте. Вы должны удалить оба '*' s. –

+0

Теперь самое время посмотреть на арифметику указателя. Как и s + 4 ~ = s [4], & s [4] -s = 4 ... или для копирования массива с завершающим 0 путем увеличения указателя 'while (* s) * d ++ = * s ++;' – technosaurus

ответ

2

Вы не можете.

Только зная случайный элемент в массиве (т. Е. Имея указатель на один элемент), вы не можете распечатать весь массив с помощью этого указателя.

Вам нужно по крайней мере две другие данные:

1) Длина массива (который вы, кажется, указывают всегда 10.)

2) Положение элемента в массиве, для которого у вас есть указатель. Чтобы вы могли вычислить с этой позиции количество элементов до и после. (В основном определяют границы массива).


После того, как вы отредактировали, ответ остается тем же. Но у вашего кода есть проблемы:

1) Вы не заполняете массив значениями. Таким образом, их значения равны неопределенным и их undefined behaviour.

2) Вы никогда не устанавливали pointer для указания элемента массива в randomElement(), и функция возвращает NULL. вы разыскиваете NULL (pointer). Опять же, это приведет к неопределенному поведению.

3) Вы должны использовать size_t для представления размера массива вместо int.

+0

1) Просто не копировал функцию, которая заполняет массив 2) Итак, как это делается? Я хотя * pointer = * (массив + randomNumber); это правильно. 3) Thx – firana

+0

1) Вы можете использовать цикл для заполнения массива в 'main()' или в 'randomElement()' для заполнения массива. 2) pointer = (array + randomNumber); 'даст вам случайный указатель. Обозначение '*' заключается в разыменовании * значения * указателя. –

+0

2) Итак, мой код просто назначил моему указателю значение элемента в массиве, с кодом, который я получаю, указатель назад, который указывает на этот элемент, правильно? – firana

1

Я не буду комментировать ваш код, что уже сделано. Вместо этого я отвечу на исходный вопрос. Синяя Луна говорит: «Вы не можете», но можете, если хотите. Вы всегда можете выполнять последовательный поиск в любой таблице, если ваш список значений заканчивается так называемым значением sentinel. Это специальное значение, которое заранее известно, что оно не принадлежит к набору нормальных данных и поэтому может использоваться для обозначения конца последовательности, например отрицательного значения, если все нормальные данные, как известно, являются положительными.

Для последовательности n неотрицательных целых чисел, хранящихся в массиве n+1 элементов, мы можем хранить array[n]= -1 как часовые после заполнения первых n элементов с нормальными данными. Тогда начните с произвольной позицией в последовательности данных и читать до конца, с чем-то вроде

// -- we assume pointer p is an initialized int* that 
// satisfies the condition array <= p < array + n 
// AND that array[n] is negative. 
for(; *p >= 0; ++p){ 
    // do something useful with *p 
} 

Нагрузочной последовательности с дозорным является хорошо известным общим методом, и вы найдете его в любой книге по алгоритмам. Вы можете использовать его с массивами и со связанными списками.В вашем случае вы должны убедиться, что элемент, следующий за последним элементом, который вы хотите получить в массиве , является дозорным и что случайный выбор не выбрал дозорный сигнал (если n - это длина последовательности, то rand() % n даст вы правильно смещаете, указывая на часового, не повредит, но цикл for немедленно прекратится). Размер выделенного массива должен быть не менееn+1, то есть максимальное количество элементов данных, которое вам нужно, плюс один для дозорного.

Кстати, в C последний элемент из массива не array[size], но array[size-1]. Нет никаких ограничений на доступ к массиву при ударе указателя на C, это зависит от вас, поскольку вы рано или поздно узнаете о сбоях программ. Чтобы избавиться от путаницы между указателями и ссылочными значениями, вы можете прочитать поучительные ответы на «Что такое C-указатель, если не адрес памяти?», here в Stackoverflow.

0

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

for (p = array; p != array + size; ++p) 

В вашем случае вы инициализацией p по-разному, но остальная часть цикла может остаться прежним:

for (; pointer != array + size; ++pointer) 
{ 
    printf("%d\n", *pointer); 
} 

Конечно же, вместо указателя можно использовать целочисленный индекс (где вы найдете начальный индекс, выполнив pointer - array).

Обратите внимание, что ваша функция randomElement в настоящее время реализована неправильно. Он записывает нулевой указатель. Вместо этого вы должны создать указатель на случайно выбранный элемент и вернуть этот указатель без разыменования. (т. е. вывести * в линию до return).

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