CS50 PSET4指针

时间:2015-06-14 16:39:20

标签: c pointers cs50

我正在尝试CS50 PSET4 有人可以解释为什么第一个有效而不是第二个?

基本上我所做的是,我在第一个循环外面声明了char *颜色,并在第二个中的所有if语句中声明了char *颜色。

当我在if语句

之外声明char *时,这是有效的
 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;       


      }
   }   
}

但是当我在所有if语句中声明char *时,这不起作用

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 *相当于一个字符串,它指向变量的地址,颜色,在这种情况下。

但是,当我在'&'中使用它时,我不确定为什么我不必放入setColor(brick, colour)(引用运算符)。

2 个答案:

答案 0 :(得分:1)

要了解为什么第二组代码不起作用,将其视为:

可能会有所帮助
    if (i==0) {
        char *colour = "RED";
    }

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

您可以更容易地看到colour的声明仅扩展到块的末尾,以便在执行下一个语句时colour不再存在。

至于你的第二个问题,setColor只使用colour的值(已经是指针),所以不需要传递对它的引用。 setcolor可以在没有引用的情况下访问字符串。

答案 1 :(得分:0)

第二个集合不起作用的原因是你试图修改C中不允许的字符串文字(char * color =“foo”)。

顺便说一下,两个版本都有未定义的行为,你应该考虑使用所有-W标志进行编译。