Указатели CS50 PSET4

Я пытаюсь использовать CS50 PSET4.
Может кто-нибудь объясните, почему первый работает вместо второго?

По сути, я объявил цвет char * вне цикла в первом и объявил цвет char * внутри всех моих операторов if во втором.

Это сработало, когда я объявил char * вне операторов if

 void initBricks(GWindow window)
 {
    char* colour;
    // TODO
    for(int i=0,y=20;i < ROWS; i++)
    { 
        y+= 30;

      for(int j=0,x=5,c=0;j < COLS; j++)
      {
        if(i==0)
        colour = "RED";

        if(i==1)
        colour = "BLUE";

        if(i==2)
        colour = "CYAN";

        if(i==3)
        colour ="ORANGE";

        if(i==4)
        colour = "GRAY";

        GRect brick = newGRect(x,y,30,15);
        setFilled(brick,true);
        setColor(brick, colour);
        add(window, brick);       
        x+= 40;       


      }
   }   
}

Но это не сработало, когда я объявил char * внутри всех операторов if

void initBricks(GWindow window)
{
    // TODO
    for(int i=0,y=20;i < ROWS; i++)
    { 
        y+= 30;

      for(int j=0,x=5,c=0;j < COLS; j++)
      {
        if(i==0)
        char *colour = "RED";

        if(i==1)
        char *colour = "BLUE";

        if(i==2)
        char *colour = "CYAN";

        if(i==3)
        char *colour ="ORANGE";

        if(i==4)
        char *colour = "GRAY";

        GRect brick = newGRect(x,y,30,15);
        setFilled(brick,true);
        setColor(brick, colour);
        add(window, brick);       
        x+= 40;       

     }
   }   
}

Я новичок в указателях, но до сих пор понимаю, что char * - это своего рода эквивалент строки, в которой он указывает на адрес переменной, color, в данном случае.

Однако я не уверен, почему мне не нужно добавлять '&' (оператор ссылки), когда я использую его в setColor(brick, colour).


person cornstar94    schedule 14.06.2015    source источник


Ответы (2)


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

    if (i==0) {
        char *colour = "RED";
    }

    if (i==1) {
        char *colour = "BLUE";
    }

Легче увидеть, что объявление colour распространяется только до конца блока, так что colour больше не существует при выполнении следующего оператора.

Что касается вашего второго вопроса, setColor использует только значение colour (которое уже является указателем), поэтому нет необходимости передавать ссылку на него. setcolor может получить доступ к строке без ссылки.

person Craig S. Anderson    schedule 14.06.2015

Причина, по которой второй набор не работает, заключается в том, что вы пытаетесь изменить строковый литерал (char * color = "foo"), что недопустимо в C.

Кстати, обе версии имеют неопределенное поведение, и вам следует подумать о компиляции со всеми включенными флагами -W.

person Learning Papa    schedule 21.05.2016