Указатель в C обновляется только один раз при вызове метода

#c #arrays #pointers #methods

#c #массивы #указатели #методы

Вопрос:

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

 #include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#define SIZE 70

void turtleMove(char raceTrack[SIZE], char *tPtr);

int main()
{
    char raceTrack[SIZE];
    for(int i = 0; i<SIZE; i  )
    {
        raceTrack[i] = ' ';
    }

    char *tPtr = raceTrack;

    for(int i = 0; i <=10; i  )
    {
        turtleMove(raceTrack, tPtr);
    }

}
void turtleMove(char raceTrack[SIZE], char *tPtr)
{
    srand(time(0));

    int num = rand() % 10   1;
    printf("%dn", num);

    if(num >= 1 amp;amp; num <= 5)
    {
        printf("Fast plodn");
        *tPtr = ' ';
        tPtr  = 3;
        *tPtr = 'T';

        for(int i = 0; i <SIZE; i  )
        {
            printf("%c,", raceTrack[i]);

        }
        printf("n");

    }
}
  

Я хочу, чтобы он делал это, например:

2 Быстрая работа, , ,T, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,

5 Быстрая работа, , , , , , , ,Т, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , и т.д…

Вместо этого он выполняет:

2 Быстрая работа, , ,T, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,

5 Быстрая работа, , ,T, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,

Комментарии:

1. tPtr в main никогда не изменяется, поэтому он всегда указывает на первый элемент.

2. OT: srand должен быть вызван в main . Если вы вызовете его в turtleMove , случайное число будет меняться только один раз в секунду.

Ответ №1:

Вы обновляете только локальное значение tPtr .

Ваша функция определяется как:

 void turtleMove(char raceTrack[SIZE], char *tPtr);
  

Это принимает указатель на char в качестве второго аргумента, поэтому все, что находится по адресу, на который указывает tPtr , может быть изменено и сохранено, но значение tPtr (сам адрес), не может.

Чтобы иметь возможность изменять адрес, вам необходимо передать указатель на указатель на char :

 void turtleMove(char raceTrack[SIZE], char **tPtr);
  

Затем в функции, когда вы хотите изменить символ, вы дважды разыменовываете:

 **tPtr = ' ';
  

И когда вы хотите изменить адрес, вы разыменовываете один раз:

 *tPtr  = 3;
  

Наконец, конечно, вам нужно исправить способ вызова, turtleMove() чтобы вы передавали char** . К счастью, вы можете сделать это, просто взяв адрес tPtr , как определено в main() :

 turtleMove(raceTrack, amp;tPtr);
  

Комментарии:

1. Это имеет большой смысл. Большое вам спасибо.