CS50 PSET4 指针

标签 c pointers cs50

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

本质上,我所做的是,我在第一个循环外部声明 char* color,并在第二个循环的所有 if 语句内声明 char* color。

当我在 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* 相当于一个字符串,在本例中它指向变量 color 的地址。

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

最佳答案

要了解为什么第二组代码不起作用,将其视为以下内容可能会有所帮助:

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

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

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

至于你的第二个问题,setColor仅使用colour的值(它已经是一个指针),因此不需要传递对其的引用。 setcolor 无需引用即可访问字符串。

关于CS50 PSET4 指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30831902/

相关文章:

c - 如何通过套接字发送结构?

C++ 限制泛型中的类型(和指针问题)

pointers - 当类型在结构定义中明确指定时,无法推断类型参数 T 的类型

c - 将字符传递给 char *

c - 我有段错误,并且不确定我的代码出了什么问题

java - 如何通过代码(例如 java)将按键输入发送到浏览器

在嵌入式设备中使用 ioperm() 与端口通信

c - 如何根据oprofile报告优化程序?

创建头文件并在 C 中测试它

c - 在 C 中包含一个外部库