2015-05-01 2 views
0

Редактировать. Можно ли взять вторую функцию и взять в качестве аргумента указатель на элемент после последнего элемента после источника? Пример copy_ptrs (target3, source, source +5)указывая на элемент?

Я включил копию всей моей программы, но то, что я пытаюсь сделать, это использовать две функции: одну с использованием нотации массива, а другую - с использованием указателя указателя, чтобы просто скопировать начальную элементы массива, считанные пользователем. Моя функция указателя не работает, поскольку она не будет печатать копию данных. Я думаю, что мои объявления указателей ошибочны? Мое знание указателей довольно ограничено, но я думаю, что решение так близко. Любая помощь будет большой.

#include <stdio.h> 
#define MAX 999 

void copy_arr(double ar[], double ar2[], int n); 
void copy_ptr(double arr[], double arr2[], int n); 

int main() 
{ 
    int i, num; 
    double source[MAX]; 
    double target1[MAX]; 
    double target2[MAX]; 


    printf("\nEnter number of elements to be read into the array: "); 
    scanf("%d", &num); 

    printf("\nEnter the values below (press enter after each entry)\n"); 

    for (i = 0; i < num; i++) 
    { 
      scanf("%lf", &source[i]); 
    } 

    //copy_arr(target1, source, num); 
    copy_ptr(target2, source, num); 


    printf("\n\nCopying Complete!\n"); 

    return 0; 
} 

void copy_arr(double target1[], double source[], int num) 
{ 
    int i; 

    for (i = 0; i < num; i++) 
    { 
      target1[i] = source[i]; 
    } 

    printf("\n***The first function uses array notation to copy the elements***\n"); 
    printf("===================================================================\n"); 

    for (i = 0; i < num; i++) 
    { 
     printf("\n    Array_Notation_Copy[%d] = %.2lf", i, target1[i]); 
    } 

} 
void copy_ptr(double target2[], double source[], int num) 
{ 
    int i; 
    double *p, *q; 

    p = source; 
    q = target2; 

    for (i = 0; i < num; i++) 
    { 
      *q = *p; 
     q++; 
     p++; 
    } 
    q = target 2 
    printf("\n\n***The second function uses pointer notation to copy the elements***\n"); 
    printf("===================================================================\n"); 

    for(i = 0; i < num; i++) 
    { 
      printf("\n    Pointer_Notation_Copy[%d] = %.2lf",i, *q++); 
    } 
} 

ответ

1

Вы используете q для печати массива target2. q больше не указывает на него в конце цикла for. Добавьте эту строку перед printf

q = target2; 

сбросить указатель q на пинту массива target2.

+0

Бинго! Спасибо за помощь! –

1

Вы действительно очень близки.

Вы только что забыли сбросить q до target2 перед печатью; поэтому при печати вы пытаетесь отобразить элементы за концом массива.

Для «редактирования» части вашего вопроса, вы можете цикл, как это:

for (double *ptr = source ; ptr != pointer_after_last ; ++ptr) 

Используя это, вы будете иметь ptr указывая на каждый из элементов, один за другим. Если вы хотите отслеживать номер позиции, просто добавьте переменную, которую вы увеличиваете при каждом запуске цикла.

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

+0

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

0

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

for(i = 0; i < num; i++) 
{ 
     printf("\n    Pointer_Notation_Copy[%d] = %.2lf",i, *q++); 
                     ^^^^^ 
} 

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

Правильная функция может выглядеть

void copy_ptr(double target2[], const double source[], int num) 
{ 
    const double *p = source; 
    double *q = target2; 

    for (; p != source + num; ++p, ++q) 
    { 
      *q = *p; 
    } 

    printf("\n\n***The second function uses pointer notation to copy the elements***\n"); 
    printf("===================================================================\n"); 

    int i = 0; 
    for (q = target2; q != target2 + num; ++q) 
    { 
      printf("\n    Pointer_Notation_Copy[%d] = %.2lf",i++, *q); 
    } 


} 
+0

Вам не удалось напечатать номер элемента, так как 'i' теперь не определено – Gianluca

+0

@Gianluca Спасибо. Я даже не видел, что напечатано. :) –

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